The Gaudi Framework  v37r0 (b608885e)
GaudiHandles.py
Go to the documentation of this file.
1 
11 from __future__ import print_function
12 
13 # explicit list for wildcard imports
14 __all__ = [
15  "GaudiHandle",
16  "PublicToolHandle",
17  "PrivateToolHandle",
18  "ServiceHandle",
19  "GaudiHandleArray",
20  "ServiceHandleArray",
21  "PublicToolHandleArray",
22  "PrivateToolHandleArray",
23 ]
24 __doc__ = """The python module holding python bindings to XyzHandles"""
25 
26 
27 class GaudiHandle(object):
28  componentType = "Unspecified" # must be overridden by derived class
29  isPublic = True # can be overridden by derived class
30 
31  def __init__(self, typeAndName):
32  object.__init__(self)
33  if hasattr(typeAndName, "toStringProperty"):
34  # this is a GaudiHandle or equivalent
35  typeAndName = typeAndName.toStringProperty()
36  if not isinstance(typeAndName, str):
37  raise TypeError(
38  "Argument to %s must be a string. Got a %s instead"
39  % (self.__class__.__name__, type(typeAndName).__name__)
40  )
41  self.typeAndName = typeAndName
42 
43  def __repr__(self):
44  return "%s(%r)" % (self.__class__.__name__, self.toStringProperty())
45 
46  def __str__(self):
47  # FIXME: (Patch #1668) this creates problem with 2.5
48  # return "%s:%s" % (self.__class__.__name__, self.toStringProperty())
49  return self.toStringProperty()
50 
51  def __opt_value__(self):
52  return self.toStringProperty()
53 
54  #
55  # Several member functions which are the same as Configurables
56  #
57  def toStringProperty(self):
58  return self.typeAndName
59 
60  def getType(self):
61  """Get the 'type' part of the \"type/name\" string."""
62  slash = self.typeAndName.find("/")
63  if slash != -1:
64  # includes name. Return part before /
65  return self.typeAndName[0:slash]
66  else:
67  # only type is given, return full string
68  return self.typeAndName
69 
70  def getName(self):
71  """Get the 'name' part of the \"type/name\" string.
72  If only a type is given, this will be returned as the name.
73  If the \"type/name\" string is empty, it will return an emtpy string."""
74  slash = self.typeAndName.find("/")
75  if slash != -1:
76  # explicit name. Return part after the /
77  return self.typeAndName[slash + 1 :]
78  else:
79  # only type is given. return type as default name
80  return self.typeAndName
81 
82  def getGaudiHandle(self):
83  return self
84 
85  def getFullName(self):
86  return self.toStringProperty()
87 
88  def __eq__(self, other):
89  return type(self) is type(other) and self.typeAndName == other.typeAndName
90 
91 
93  __slots__ = ()
94  componentType = "AlgTool"
95  isPublic = True
96 
97  def __init__(self, toolTypeAndName=""):
98  GaudiHandle.__init__(self, toolTypeAndName)
99 
100 
102  __slots__ = ()
103  componentType = "AlgTool"
104  isPublic = False
105 
106  def __init__(self, toolTypeAndName=""):
107  GaudiHandle.__init__(self, toolTypeAndName)
108 
109 
111  __slots__ = ()
112  componentType = "Service"
113  isPublic = True
114 
115  def __init__(self, serviceName=""):
116  GaudiHandle.__init__(self, serviceName)
117 
118 
119 #
120 # The HandleArrays
121 #
122 
123 
124 class GaudiHandleArray(list):
125  """A list of GaudiHandles. Only handles of one type are allowed, as specified by self.__class__.handleType"""
126 
127  handleType = None # must be set by derived class to the handle type
128 
129  def __init__(self, typesAndNames=None):
130  if typesAndNames is None:
131  typesAndNames = []
132  list.__init__(self)
133  # check the type
134  if not isinstance(typesAndNames, list):
135  raise TypeError(
136  "Argument to %s must be a list. Got a %s instead"
137  % (self.__class__.__name__, type(typesAndNames).__name__)
138  )
139  # add entries to list
140  for tn in typesAndNames:
141  self.append(tn)
142 
143  def __repr__(self):
144  """Return class name with list of type/name strings as argument"""
145  return (
146  self.__class__.__name__
147  + "(["
148  + ",".join(repr(h.toStringProperty()) for h in self)
149  + "])"
150  )
151 
152  def __str__(self):
153  """Print in a form which can be parsed"""
154  return self.toStringProperty()
155  # shortName = self.__class__.__name__
156  # return "%s:%s" % (shortName,
157  # linesep + linesep.join([str(s) for s in self]))
158 
159  def __getitem__(self, index):
160  if isinstance(index, str):
161  # seach by instance name
162  for h in self:
163  if h.getName() == index:
164  return h
165  raise IndexError(
166  "%s does not have a %s with instance name %s"
167  % (self.__class__.__name__, self.handleType.componentType, index)
168  )
169  else:
170  return list.__getitem__(self, index)
171 
172  def __delitem__(self, key):
173  super(GaudiHandleArray, self).__delitem__(self.index(self[key]))
174 
175  def __iadd__(self, array):
176  if isinstance(array, (list, type(self))):
177  for v in array:
178  self.append(v)
179  else:
180  raise TypeError(
181  "Can not add a %s to a %s" % (type(array).__name__, type(self).__name__)
182  )
183 
184  return self
185 
186  def append(self, value):
187  """Only allow appending compatible types. It accepts a string, a handle or a configurable."""
188  if isinstance(value, str):
189  # convert string to handle
190  value = self.__class__.handleType(value)
191  elif isinstance(value, self.__class__.handleType):
192  pass # leave handle as-is
193  elif isinstance(value, GaudiHandle):
194  # do not allow different type of handles
195  raise TypeError(
196  "Can not add a %s to a %s"
197  % (value.__class__.__name__, self.__class__.__name__)
198  )
199  elif value.getGaudiType() != self.__class__.handleType.componentType:
200  # assume it is a configurable: allow only correct types
201  raise TypeError(
202  "Can not append %s (%s) to a %s"
203  % (
204  value.__class__.__name__,
205  value.getGaudiType(),
206  self.__class__.__name__,
207  )
208  )
209  elif hasattr(value, "isPublic"):
210  # check public vs private if applicable for this configurable
211  pop = value.isPublic() and "Public" or "Private"
212  if value.isPublic() != self.__class__.handleType.isPublic:
213  raise TypeError(
214  "Can not append %s (%s %s) to a %s"
215  % (
216  value.__class__.__name__,
217  pop,
218  value.getGaudiType(),
219  self.__class__.__name__,
220  )
221  )
222 
223  # check that an instance name appears only once in the list
224  try:
225  oldValue = self.__getitem__(value.getName())
226  except IndexError:
227  # not yet there, so add it
228  list.append(self, value)
229  else:
230  print(
231  "%s WARNING %r with instance name %r already in list. Not adding %r"
232  % (self.__class__.__name__, oldValue, oldValue.getName(), value)
233  )
234 
235  def isPublic(self):
236  return self.__class__.handleType.isPublic
237 
238  #
239  # Member functions which are the same as Configurables
240  #
241  def toStringProperty(self):
242  return "[" + ",".join(repr(v.toStringProperty()) for v in self) + "]"
243 
244 
246  __slots__ = ()
247  handleType = ServiceHandle
248 
249  def __init__(self, serviceTypesAndNames=None):
250  GaudiHandleArray.__init__(self, serviceTypesAndNames)
251 
252 
254  __slots__ = ()
255  handleType = PublicToolHandle
256 
257  def __init__(self, toolTypesAndNames=None):
258  GaudiHandleArray.__init__(self, toolTypesAndNames)
259 
260 
262  __slots__ = ()
263  handleType = PrivateToolHandle
264 
265  def __init__(self, toolTypesAndNames=None):
266  GaudiHandleArray.__init__(self, toolTypesAndNames)
GaudiKernel.GaudiHandles.PublicToolHandle.__init__
def __init__(self, toolTypeAndName="")
Definition: GaudiHandles.py:97
GaudiKernel.GaudiHandles.GaudiHandle.getGaudiHandle
def getGaudiHandle(self)
Definition: GaudiHandles.py:82
GaudiKernel.GaudiHandles.GaudiHandleArray.__repr__
def __repr__(self)
Definition: GaudiHandles.py:143
GaudiKernel.GaudiHandles.GaudiHandleArray.handleType
handleType
Definition: GaudiHandles.py:127
GaudiKernel.GaudiHandles.GaudiHandle
Definition: GaudiHandles.py:27
GaudiKernel.GaudiHandles.GaudiHandle.getType
def getType(self)
Definition: GaudiHandles.py:60
GaudiKernel.GaudiHandles.GaudiHandle.typeAndName
typeAndName
Definition: GaudiHandles.py:41
GaudiKernel.GaudiHandles.GaudiHandleArray.isPublic
def isPublic(self)
Definition: GaudiHandles.py:235
GaudiKernel.GaudiHandles.PrivateToolHandleArray
Definition: GaudiHandles.py:261
GaudiKernel.GaudiHandles.GaudiHandle.__str__
def __str__(self)
Definition: GaudiHandles.py:46
GaudiKernel.GaudiHandles.PrivateToolHandleArray.__init__
def __init__(self, toolTypesAndNames=None)
Definition: GaudiHandles.py:265
GaudiKernel.GaudiHandles.GaudiHandleArray
Definition: GaudiHandles.py:124
GaudiKernel.GaudiHandles.GaudiHandle.__repr__
def __repr__(self)
Definition: GaudiHandles.py:43
GaudiKernel.GaudiHandles.PublicToolHandleArray
Definition: GaudiHandles.py:253
GaudiKernel.GaudiHandles.GaudiHandleArray.__getitem__
def __getitem__(self, index)
Definition: GaudiHandles.py:159
GaudiKernel.GaudiHandles.ServiceHandle
Definition: GaudiHandles.py:110
GaudiKernel.GaudiHandles.GaudiHandleArray.__delitem__
def __delitem__(self, key)
Definition: GaudiHandles.py:172
GaudiKernel.GaudiHandles.GaudiHandle.__init__
def __init__(self, typeAndName)
Definition: GaudiHandles.py:31
gaudirun.type
type
Definition: gaudirun.py:162
GaudiKernel.GaudiHandles.GaudiHandleArray.append
def append(self, value)
Definition: GaudiHandles.py:186
GaudiKernel.GaudiHandles.GaudiHandleArray.__iadd__
def __iadd__(self, array)
Definition: GaudiHandles.py:175
GaudiKernel.GaudiHandles.GaudiHandle.getName
def getName(self)
Definition: GaudiHandles.py:70
GaudiKernel.GaudiHandles.GaudiHandle.toStringProperty
def toStringProperty(self)
Definition: GaudiHandles.py:57
GaudiKernel.GaudiHandles.PrivateToolHandle
Definition: GaudiHandles.py:101
GaudiKernel.GaudiHandles.GaudiHandle.__opt_value__
def __opt_value__(self)
Definition: GaudiHandles.py:51
GaudiKernel.GaudiHandles.GaudiHandle.getFullName
def getFullName(self)
Definition: GaudiHandles.py:85
GaudiKernel.GaudiHandles.PublicToolHandleArray.__init__
def __init__(self, toolTypesAndNames=None)
Definition: GaudiHandles.py:257
GaudiKernel.GaudiHandles.GaudiHandle.__eq__
def __eq__(self, other)
Definition: GaudiHandles.py:88
GaudiKernel.GaudiHandles.GaudiHandleArray.toStringProperty
def toStringProperty(self)
Definition: GaudiHandles.py:241
GaudiKernel.GaudiHandles.PrivateToolHandle.__init__
def __init__(self, toolTypeAndName="")
Definition: GaudiHandles.py:106
GaudiKernel.GaudiHandles.GaudiHandleArray.__str__
def __str__(self)
Definition: GaudiHandles.py:152
GaudiKernel.GaudiHandles.PublicToolHandle
Definition: GaudiHandles.py:92
GaudiKernel.GaudiHandles.ServiceHandleArray.__init__
def __init__(self, serviceTypesAndNames=None)
Definition: GaudiHandles.py:249
GaudiKernel.GaudiHandles.GaudiHandleArray.__init__
def __init__(self, typesAndNames=None)
Definition: GaudiHandles.py:129
GaudiKernel.GaudiHandles.ServiceHandleArray
Definition: GaudiHandles.py:245
GaudiKernel.GaudiHandles.ServiceHandle.__init__
def __init__(self, serviceName="")
Definition: GaudiHandles.py:115