The Gaudi Framework  v36r6 (b1ee9983)
GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase Class Reference
Inheritance diagram for GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase:
Collaboration diagram for GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase:

Public Member Functions

def __init__ (self, descr, docString, default, handleType, allowedType)
 
def __get__ (self, obj, type=None)
 
def __set__ (self, obj, value)
 
def isHandle (self, value)
 
def isConfig (self, value)
 
def getDefaultConfigurable (self, typeAndName, requester)
 
def convertDefaultToBeSet (self, obj, default)
 
def convertValueToBeSet (self, obj, value)
 
- Public Member Functions inherited from GaudiKernel.PropertyProxy.PropertyProxy
def __init__ (self, descr, docString=None, default=None)
 
def setDefault (self, value)
 
def getDefault (self)
 
def fullPropertyName (self, obj)
 
def __delete__ (self, obj)
 

Private Attributes

 _handleType
 
 _confTypeName
 

Additional Inherited Members

- Public Attributes inherited from GaudiKernel.PropertyProxy.PropertyProxy
 history
 
 descr
 
 deprecated
 
- Properties inherited from GaudiKernel.PropertyProxy.PropertyProxy
 default = property(getDefault, setDefault)
 

Detailed Description

A class with some utilities for GaudiHandles and GaudiHandleArrays

Definition at line 183 of file PropertyProxy.py.

Constructor & Destructor Documentation

◆ __init__()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.__init__ (   self,
  descr,
  docString,
  default,
  handleType,
  allowedType 
)
<descr>: the real property in the object instance (from __slots__)
<docString>: the documentation string of this property
<default>: default value from C++ (via python generated by genconf)
<handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...)
<allowedType>: allowed instance type for default

Definition at line 186 of file PropertyProxy.py.

186  def __init__(self, descr, docString, default, handleType, allowedType):
187  """<descr>: the real property in the object instance (from __slots__)
188  <docString>: the documentation string of this property
189  <default>: default value from C++ (via python generated by genconf)
190  <handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...)
191  <allowedType>: allowed instance type for default
192  """
193  # check that default is of allowed type for this proxy
194  if not isinstance(default, allowedType):
195  raise TypeError(
196  "%s: %s default: %r is not a %s"
197  % (
198  descr.__name__,
199  self.__class__.__name__,
200  default,
201  allowedType.__name__,
202  )
203  )
204  PropertyProxy.__init__(self, descr, docString, default)
205  self._handleType = handleType
206  self._confTypeName = "Configurable" + handleType.componentType
207 

Member Function Documentation

◆ __get__()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.__get__ (   self,
  obj,
  type = None 
)

Reimplemented from GaudiKernel.PropertyProxy.PropertyProxy.

Definition at line 210 of file PropertyProxy.py.

210  def __get__(self, obj, type=None):
211  try:
212  return self.descr.__get__(obj, type)
213  except AttributeError:
214  # Get default
215  try:
216  default = obj.__class__.getDefaultProperty(self.descr.__name__)
217  default = self.convertDefaultToBeSet(obj, default)
218  if default:
219  self.__set__(obj, default)
220  except AttributeError as e:
221  # change type of exception to avoid false error message
222  raise RuntimeError(*e.args)
223 
224  return self.descr.__get__(obj, type)
225 

◆ __set__()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.__set__ (   self,
  obj,
  value 
)

Reimplemented from GaudiKernel.PropertyProxy.PropertyProxy.

Definition at line 226 of file PropertyProxy.py.

226  def __set__(self, obj, value):
227  # allow a property to be set if we're in non-default mode, or if it
228  # simply hasn't been set before
229  if not obj._isInSetDefaults() or not obj in self.history:
230  value = self.convertValueToBeSet(obj, value)
231  # assign the value
232  self.descr.__set__(obj, value)
233  log.debug("Setting %s = %r", self.fullPropertyName(obj), value)
234  self.history.setdefault(obj, []).append(value)
235 

◆ convertDefaultToBeSet()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.convertDefaultToBeSet (   self,
  obj,
  default 
)

Reimplemented in GaudiKernel.PropertyProxy.GaudiHandleArrayPropertyProxy.

Definition at line 268 of file PropertyProxy.py.

268  def convertDefaultToBeSet(self, obj, default):
269  # turn string into handle
270  isString = type(default) == str
271  if not isString and self.isConfig(default):
272  # print self.fullPropertyName(obj) + ": Setting default configurable: %r" % default
273  return default
274  elif isString or self.isHandle(default):
275  if isString:
276  # convert string into handle
277  typeAndName = default
278  default = self._handleType(typeAndName)
279  else:
280  typeAndName = default.typeAndName
281  if not self._handleType.isPublic:
282  if not typeAndName:
283  return None
284  # Find corresponding default configurable of private handles
285  # (make sure the name used to instantiate the private tool
286  # includes the name of the owner, see https://gitlab.cern.ch/gaudi/Gaudi/-/issues/141)
287  if "/" in typeAndName:
288  typeAndName = typeAndName.replace("/", "/{}.".format(obj.name()), 1)
289  else:
290  typeAndName = "{0}/{1}.{0}".format(typeAndName, obj.name())
291  try:
292  conf = self.getDefaultConfigurable(
293  typeAndName, self.fullPropertyName(obj)
294  )
295 
296  # print self.fullPropertyName(obj) + ": Setting default private configurable (from default handle): %r" % conf
297  except AttributeError as e:
298  # change type of exception to avoid false error message
299  raise RuntimeError(*e.args)
300  if conf is None:
301  raise RuntimeError(
302  "%s: Default configurable for class %s not found in ConfigurableDb.CfgDb"
303  % (self.fullPropertyName(obj), default.getType())
304  )
305  return conf
306  else: # not a config, not a handle, not a string
307  raise TypeError(
308  "%s: default value %r is not of type %s or %s"
309  % (
310  self.fullPropertyName(obj),
311  default,
312  self._confTypeName,
313  self._handleType.__name__,
314  )
315  )
316 
317  return default
318 

◆ convertValueToBeSet()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.convertValueToBeSet (   self,
  obj,
  value 
)

Reimplemented in GaudiKernel.PropertyProxy.GaudiHandleArrayPropertyProxy.

Definition at line 319 of file PropertyProxy.py.

319  def convertValueToBeSet(self, obj, value):
320  if value is None:
321  value = ""
322  isString = type(value) == str
323  if isString:
324  # create an new handle
325  return self._handleType(value)
326  elif self.isHandle(value):
327  # make a copy of the handle
328  return self._handleType(value.toStringProperty())
329  elif self.isConfig(value):
330  if self._handleType.isPublic:
331  # A public tool must be registered to ToolSvc before assigning it
332  if derives_from(value, "ConfigurableAlgTool"):
333  if not value.isInToolSvc():
334  suggestion = (
335  "You may need to add jobOptions lines something like:"
336  + os.linesep
337  + "from AthenaCommon.AppMgr import ToolSvc"
338  + os.linesep
339  + "ToolSvc += "
340  )
341  if value.getName() == value.getType(): # using default name
342  suggestion += "%s()" % value.__class__.__name__
343  else: # using user-defined name
344  suggestion += "%s(%r)" % (
345  value.__class__.__name__,
346  value.getName(),
347  )
348  raise RuntimeError(
349  self.fullPropertyName(obj)
350  + ": Public tool %s is not yet in ToolSvc. %s"
351  % (value.getJobOptName(), suggestion)
352  )
353  # make it read-only
354  return self._handleType(value.toStringProperty())
355  elif value.hasParent(obj.getJobOptName()):
356  # is already a child, keep as-is
357  return value
358  else:
359  # make a copy of the configurable
360  value = obj.copyChildAndSetParent(value, obj.getJobOptName())
361  # ensure that the new object is in allConfigurables
362  obj.allConfigurables[value.name()] = value
363  return value
364  else:
365  raise TypeError(
366  "Property %s value %r is not a %s nor a %s nor a string"
367  % (
368  self.fullPropertyName(obj),
369  value,
370  self._confTypeName,
371  self._handleType.__name__,
372  )
373  )
374 
375  return value
376 
377 

◆ getDefaultConfigurable()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.getDefaultConfigurable (   self,
  typeAndName,
  requester 
)
Return the configurable instance corresponding to the toolhandle if possible.
Otherwise return None

Definition at line 244 of file PropertyProxy.py.

244  def getDefaultConfigurable(self, typeAndName, requester):
245  """Return the configurable instance corresponding to the toolhandle if possible.
246  Otherwise return None"""
247  global log
248  # find the module
249  typeAndNameTuple = typeAndName.split("/")
250  confType = typeAndNameTuple[0]
251  confClass = ConfigurableDb.getConfigurable(confType)
252  # check the type of the configurable
253  if not derives_from(confClass, self._confTypeName):
254  log.error(
255  "%s: Configurable %s is not a %s",
256  requester,
257  confType,
258  self._confTypeName,
259  )
260  return None
261  try:
262  confName = typeAndNameTuple[1]
263  except IndexError:
264  return confClass() # use default name
265  else:
266  return confClass(confName)
267 

◆ isConfig()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.isConfig (   self,
  value 
)
Check if <value> is a configurable of the correct type

Definition at line 240 of file PropertyProxy.py.

240  def isConfig(self, value):
241  """Check if <value> is a configurable of the correct type"""
242  return derives_from(value, self._confTypeName)
243 

◆ isHandle()

def GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase.isHandle (   self,
  value 
)
Check if <value> is a handle of the correct type

Definition at line 236 of file PropertyProxy.py.

236  def isHandle(self, value):
237  """Check if <value> is a handle of the correct type"""
238  return isinstance(value, self._handleType)
239 

Member Data Documentation

◆ _confTypeName

GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase._confTypeName
private

Definition at line 206 of file PropertyProxy.py.

◆ _handleType

GaudiKernel.PropertyProxy.GaudiHandlePropertyProxyBase._handleType
private

Definition at line 205 of file PropertyProxy.py.


The documentation for this class was generated from the following file:
GaudiKernel.PropertyProxy.derives_from
def derives_from(derived, base)
Definition: PropertyProxy.py:29
format
GAUDI_API std::string format(const char *,...)
MsgStream format utility "a la sprintf(...)".
Definition: MsgStream.cpp:119
gaudirun.type
type
Definition: gaudirun.py:160