6 __all__ = [
'PropertyProxy',
'GaudiHandlePropertyProxy',
7 'GaudiHandleArrayPropertyProxy']
12 from GaudiKernel
import ConfigurableDb
16 log = logging.getLogger(
'PropertyProxy')
23 """A string version of isinstance(). 24 <derived> is either an object instance, or a type 25 <base> is a string containing the name of the base class (or <derived> class)""" 26 if not isinstance(derived, type):
27 derived =
type(derived)
28 if derived.__name__ == base:
30 for b
in derived.__bases__:
38 errmsg =
"received an instance of %s, but %s expected" % (
type(value), tp)
47 elif isinstance(value, DataObjectHandleBase):
52 raise ValueError(errmsg)
53 elif (tp
in [list, tuple, dict]):
54 if (
type(value)
is tp):
59 raise ValueError(errmsg)
66 except (TypeError, ValueError):
67 raise ValueError(errmsg)
73 def __init__(self, descr, docString=None, default=None):
79 if '[[deprecated]]' in docString:
81 if default
is not None:
93 return (obj.getJobOptName()
or obj.getName()) +
'.' + self.descr.__name__
97 return self.descr.__get__(obj, type)
98 except AttributeError:
101 if self.__default.__class__
in [list, dict]:
103 obj, self.__default.__class__(self.
__default))
104 return self.descr.__get__(obj, type)
113 log.warning(
'Property %s is deprecated: %s',
117 proptype, allowcompat =
None,
False 118 if hasattr(self,
'default'):
120 if self.descr.__name__ ==
'OutputLevel':
129 if proptype
and proptype !=
type(
None)
and \
138 oldvec = self.descr.__get__(obj, type)
140 tpo =
type(oldvec[0])
143 except AttributeError:
146 except ValueError, e:
148 log.error(
'inconsistent value types for %s.%s (%s)' %
149 (obj.getName(), self.descr.__name__, str(e)))
155 if not obj._isInSetDefaults()
or not obj
in self.
history:
157 if hasattr(self,
'default')
and self.
default ==
None:
158 obj.__iadd__(value, self.
descr)
160 self.descr.__set__(obj, value)
161 self.history.setdefault(obj, []).append(value)
166 self.descr.__delete__(obj)
170 """A class with some utilities for GaudiHandles and GaudiHandleArrays""" 172 def __init__(self, descr, docString, default, handleType, allowedType):
173 """<descr>: the real property in the object instance (from __slots__) 174 <docString>: the documentation string of this property 175 <default>: default value from C++ (via python generated by genconf) 176 <handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...) 177 <allowedType>: allowed instance type for default 180 if not isinstance(default, allowedType):
181 raise TypeError(
"%s: %s default: %r is not a %s" %
182 (descr.__name__, self.__class__.__name__, default, allowedType.__name__))
183 PropertyProxy.__init__(self, descr, docString, default)
190 return self.descr.__get__(obj, type)
191 except AttributeError:
194 default = obj.__class__.getDefaultProperty(self.descr.__name__)
198 except AttributeError, e:
200 raise RuntimeError(*e.args)
202 return self.descr.__get__(obj, type)
207 if not obj._isInSetDefaults()
or not obj
in self.
history:
210 self.descr.__set__(obj, value)
212 self.history.setdefault(obj, []).append(value)
215 """Check if <value> is a handle of the correct type""" 219 """Check if <value> is a configurable of the correct type""" 223 """Return the configurable instance corresponding to the toolhandle if possible. 224 Otherwise return None""" 227 typeAndNameTuple = typeAndName.split(
'/')
228 confType = typeAndNameTuple[0]
229 confClass = ConfigurableDb.getConfigurable(confType)
232 log.error(
"%s: Configurable %s is not a %s",
236 confName = typeAndNameTuple[1]
240 return confClass(confName)
244 isString =
type(default) == str
245 if not isString
and self.
isConfig(default):
248 elif isString
or self.
isHandle(default):
251 typeAndName = default
254 typeAndName = default.typeAndName
255 if not self._handleType.isPublic:
263 except AttributeError, e:
265 raise RuntimeError(*e.args)
267 raise RuntimeError(
"%s: Default configurable for class %s not found in ConfigurableDb.CfgDb" %
271 raise TypeError(
"%s: default value %r is not of type %s or %s" %
279 isString =
type(value) == str
287 if self._handleType.isPublic:
290 if not value.isInToolSvc():
291 suggestion =
'You may need to add jobOptions lines something like:' + os.linesep + \
292 'from AthenaCommon.AppMgr import ToolSvc' + os.linesep + \
294 if value.getName() == value.getType():
295 suggestion +=
'%s()' % value.__class__.__name__
297 suggestion +=
'%s(%r)' % (value.__class__.__name__,
300 ': Public tool %s is not yet in ToolSvc. %s' %
301 (value.getJobOptName(), suggestion))
304 elif value.hasParent(obj.getJobOptName()):
309 value = obj.copyChildAndSetParent(value, obj.getJobOptName())
311 obj.allConfigurables[value.name()] = value
314 raise TypeError(
"Property %s value %r is not a %s nor a %s nor a string" %
322 GaudiHandlePropertyProxyBase.__init__(
323 self, descr, docString, default,
type(default), GaudiHandle)
328 """<descr>: the real property in the object instance (from __slots__) 329 <confTypeName>: string indicating the (base) class of allowed Configurables to be assigned. 330 <handleType>: real python handle type (e.g. PublicToolHandle, PrivateToolHandle, ...) 332 GaudiHandlePropertyProxyBase.__init__(
333 self, descr, docString, default,
type(default).handleType, GaudiHandleArray)
337 if not isinstance(value, list)
and not isinstance(value, self.
arrayType):
338 raise TypeError(
"%s: Value %r is not a list nor a %s" %
345 cd = GaudiHandlePropertyProxyBase.convertDefaultToBeSet(
348 newDefault.append(cd)
356 cv = GaudiHandlePropertyProxyBase.convertValueToBeSet(self, obj, v)
366 PropertyProxy.__init__(self, descr, docString, default)
370 return self.descr.__get__(obj, type)
371 except AttributeError:
374 default = obj.__class__.getDefaultProperty(self.descr.__name__)
378 except AttributeError, e:
380 raise RuntimeError(*e.args)
382 return self.descr.__get__(obj, type)
385 if not obj._isInSetDefaults()
or not obj
in self.
history:
388 self.descr.__set__(obj, value)
390 self.history.setdefault(obj, []).append(value)
396 if type(value) == str:
398 elif isinstance(value, DataObjectHandleBase):
401 raise ValueError(
"received an instance of %s, but %s expected" %
402 (
type(value),
'str or DataObjectHandleBase'))
408 if isinstance(default, GaudiHandleArray):
411 if isinstance(default, GaudiHandle):
414 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)