6 __all__ = [
'PropertyProxy',
'GaudiHandlePropertyProxy',
'GaudiHandleArrayPropertyProxy' ]
10 from GaudiKernel
import ConfigurableDb
14 log = logging.getLogger(
'PropertyProxy' )
21 """A string version of isinstance(). 22 <derived> is either an object instance, or a type 23 <base> is a string containing the name of the base class (or <derived> class)""" 24 if not isinstance(derived,type): derived=
type(derived)
25 if derived.__name__ == base:
return True 26 for b
in derived.__bases__:
32 errmsg =
"received an instance of %s, but %s expected" % (
type(value),tp)
42 raise ValueError( errmsg )
43 elif ( tp
in [ list, tuple, dict ] ):
44 if (
type(value)
is tp ):
49 raise ValueError( errmsg )
56 except (TypeError,ValueError):
57 raise ValueError( errmsg )
63 def __init__( self, descr, docString=None, default=None ):
68 if default
is not None:
81 return (obj.getJobOptName()
or obj.getName()) +
'.' + self.descr.__name__
85 return self.descr.__get__( obj, type )
86 except AttributeError:
89 if self.__default.__class__
in [ list, dict ]:
90 self.descr.__set__( obj, self.__default.__class__(self.
__default) )
91 return self.descr.__get__( obj, type )
99 proptype, allowcompat =
None,
False 100 if hasattr( self,
'default' ):
102 if self.descr.__name__ ==
'OutputLevel':
111 if proptype
and proptype !=
type(
None)
and \
120 oldvec = self.descr.__get__( obj, type )
122 tpo =
type(oldvec[0])
125 except AttributeError:
128 except ValueError, e:
130 log.error(
'inconsistent value types for %s.%s (%s)' %\
131 (obj.getName(),self.descr.__name__,str(e)) )
137 if not obj._isInSetDefaults()
or not obj
in self.
history:
139 if hasattr( self,
'default' )
and self.
default ==
None:
140 obj.__iadd__( value, self.
descr )
142 self.descr.__set__( obj, value )
143 self.history.setdefault( obj, [] ).append( value )
148 self.descr.__delete__( obj )
153 """A class with some utilities for GaudiHandles and GaudiHandleArrays""" 155 def __init__(self, descr, docString, default, handleType, allowedType ):
156 """<descr>: the real property in the object instance (from __slots__) 157 <docString>: the documentation string of this property 158 <default>: default value from C++ (via python generated by genconf) 159 <handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...) 160 <allowedType>: allowed instance type for default 163 if not isinstance(default,allowedType):
164 raise TypeError(
"%s: %s default: %r is not a %s" % \
165 ( descr.__name__, self.__class__.__name__, default, allowedType.__name__ ) )
166 PropertyProxy.__init__( self, descr, docString, default )
174 return self.descr.__get__( obj, type )
175 except AttributeError:
178 default = obj.__class__.getDefaultProperty( self.descr.__name__ )
182 except AttributeError,e:
184 raise RuntimeError(*e.args)
186 return self.descr.__get__( obj, type )
192 if not obj._isInSetDefaults()
or not obj
in self.
history:
195 self.descr.__set__( obj, value )
197 self.history.setdefault( obj, [] ).append( value )
202 """Check if <value> is a handle of the correct type""" 207 """Check if <value> is a configurable of the correct type""" 212 """Return the configurable instance corresponding to the toolhandle if possible. 213 Otherwise return None""" 216 typeAndNameTuple = typeAndName.split(
'/')
217 confType = typeAndNameTuple[0]
218 confClass=ConfigurableDb.getConfigurable(confType)
221 log.error(
"%s: Configurable %s is not a %s",
225 confName = typeAndNameTuple[1]
229 return confClass(confName)
234 isString =
type(default) == str
235 if not isString
and self.
isConfig(default):
238 elif isString
or self.
isHandle(default):
241 typeAndName = default
244 typeAndName = default.typeAndName
245 if not self._handleType.isPublic:
252 except AttributeError,e:
254 raise RuntimeError(*e.args)
256 raise RuntimeError(
"%s: Default configurable for class %s not found in ConfigurableDb.CfgDb" % \
260 raise TypeError(
"%s: default value %r is not of type %s or %s" % \
266 if value
is None: value =
'' 267 isString =
type(value) == str
275 if self._handleType.isPublic:
278 if not value.isInToolSvc():
279 suggestion =
'You may need to add jobOptions lines something like:' + os.linesep + \
280 'from AthenaCommon.AppMgr import ToolSvc' + os.linesep + \
282 if value.getName() == value.getType():
283 suggestion +=
'%s()' % value.__class__.__name__
285 suggestion +=
'%s(%r)' % (value.__class__.__name__,value.getName())
287 ': Public tool %s is not yet in ToolSvc. %s' %
288 (value.getJobOptName(),suggestion) )
291 elif value.hasParent( obj.getJobOptName() ):
296 value = obj.copyChildAndSetParent( value, obj.getJobOptName() )
298 obj.allConfigurables[value.name()] = value
301 raise TypeError(
"Property %s value %r is not a %s nor a %s nor a string" % \
309 GaudiHandlePropertyProxyBase.__init__( self, descr, docString, default,
type(default), GaudiHandle )
314 """<descr>: the real property in the object instance (from __slots__) 315 <confTypeName>: string indicating the (base) class of allowed Configurables to be assigned. 316 <handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...) 318 GaudiHandlePropertyProxyBase.__init__( self, descr, docString, default,
type(default).handleType, GaudiHandleArray )
323 if not isinstance( value, list )
and not isinstance( value, self.
arrayType ):
324 raise TypeError(
"%s: Value %r is not a list nor a %s" % \
332 cd = GaudiHandlePropertyProxyBase.convertDefaultToBeSet( self, obj, d )
333 if cd: newDefault.append( cd )
342 cv = GaudiHandlePropertyProxyBase.convertValueToBeSet( self, obj, v )
343 if cv: newValue.append( cv )
350 PropertyProxy.__init__( self, descr, docString, default )
354 return self.descr.__get__( obj, type )
355 except AttributeError:
358 default = obj.__class__.getDefaultProperty( self.descr.__name__ )
362 except AttributeError,e:
364 raise RuntimeError(*e.args)
366 return self.descr.__get__( obj, type )
369 if not obj._isInSetDefaults()
or not obj
in self.
history:
372 self.descr.__set__( obj, value )
374 self.history.setdefault( obj, [] ).append( value)
377 if value
is None: value =
'' 379 if type(value) == str:
381 elif isinstance(value, DataObjectHandleBase):
388 if isinstance(default,GaudiHandleArray):
391 if isinstance(default,GaudiHandle):
394 if isinstance(default,DataObjectHandleBase):
def convertValueToBeSet(self, obj, value)
def getDefaultConfigurable(self, typeAndName, requester)
def __delete__(self, obj)
def convertDefaultToBeSet(self, obj, default)
def isConfig(self, value)
def isHandle(self, value)
def __get__(self, obj, type=None)
Gaudi::Details::PropertyBase * property(const std::string &name) const
def checkType(self, obj, value)
def convertValueToBeSet(self, obj, value)
def convertValueToBeSet(self, obj, value)
def __set__(self, obj, value)
def __get__(self, obj, type=None)
def __init__(self, descr, docString=None, default=None)
def __init__(self, descr, docString, default)
def __set__(self, obj, value)
def __init__(self, descr, docString, default, handleType, allowedType)
def __init__(self, descr, docString, default)
def __set__(self, obj, value)
def __get__(self, obj, type=None)
def derives_from(derived, base)
def PropertyProxyFactory(descr, doc, default)
def __init__(self, descr, docString, default)
def fullPropertyName(self, obj)
def convertDefaultToBeSet(self, obj, default)
def _isCompatible(tp, value)
def setDefault(self, value)