ATLAS Offline Software
Loading...
Searching...
No Matches
python.Node.Node Class Reference
Collaboration diagram for python.Node.Node:

Public Member Functions

 __init__ (self, name="root", flags=None, root=None)
 __setattr__ (self, name, value)
 __getattribute__ (self, name)
 __getattr__ (self, name)
 __contains__ (self, name)
 __copy__ (self)
 __delattr__ (self, name)
 __delitem__ (self, name)
 lock (self, lockstate=_LOCKED)
 unlock (self)
 lock_forever (self)
 islocked (self)
 locked (self)
 name (self)
 add (self, attr_name, value)
 addFlag (self, tag, value, flags=None)
 addNode (self, item, flags=None)
 has (self, name, value=None)
 hasFlag (self, name)
 hasNode (self, name)
 nodes (self)
 node_flags (self)
 node (self, name)
 delete (self, name)
 rename (self, name, newname)
 clone (self, name=None)
 print (self, spacer="")
 dump (self)
 cloneAndReplace (self, targetname, flagname)

Protected Member Functions

 _fail_if_locked_forever (self)
 _fail_if_locked (self)
 _loadflags (self, name)
 _addDynaFlags (self, name)
 _stragglers (self, flags, dbg="")
 _rootnode (self)
 _setrootnode (self, rootnode)
 _addFlagImpl (self, tag, value, flags=None, unlock=False)
 _addFlagUnlock (self, tag, value, flags=None)
 _addNewNode (self, str name, flags=None)
 _addNode (self, node)
 _hasFlagPath (self, name)

Protected Attributes

raise AttributeError(f) _children
return self._root._loadflags(name) _root
 _lockstate = _LOCKED:

Private Attributes

raise AttributeError(f) __dict__

Detailed Description

Basic node class, so we can get all the egregious flags from a
flags object, and use, and pass round, the individual nodes, as
actual nodes without all the nonsense limitations of using the
flags directly

Definition at line 52 of file Node.py.

Constructor & Destructor Documentation

◆ __init__()

python.Node.Node.__init__ ( self,
name = "root",
flags = None,
root = None )

Definition at line 60 of file Node.py.

60 def __init__(self, name="root", flags=None, root=None ):
61 object.__setattr__(self, "_lockstate", _UNLOCKED)
62 object.__setattr__(self, "_name", name)
63 object.__setattr__(self, "_children", {})
64 object.__setattr__(self, "_flags", flags)
65 object.__setattr__(self, "_root", root)
66

Member Function Documentation

◆ __contains__()

python.Node.Node.__contains__ ( self,
name )

Definition at line 98 of file Node.py.

98 def __contains__(self, name):
99 return self.has(name)
100

◆ __copy__()

python.Node.Node.__copy__ ( self)

Definition at line 101 of file Node.py.

101 def __copy__(self):
102 return self.clone()
103

◆ __delattr__()

python.Node.Node.__delattr__ ( self,
name )

Definition at line 104 of file Node.py.

104 def __delattr__(self, name):
105 self.delete(name)
106

◆ __delitem__()

python.Node.Node.__delitem__ ( self,
name )

Definition at line 107 of file Node.py.

107 def __delitem__(self, name):
108 self.delete(name)
109

◆ __getattr__()

python.Node.Node.__getattr__ ( self,
name )
will attempt a dynamic load from flags if need be 

Definition at line 83 of file Node.py.

83 def __getattr__(self, name):
84 """ will attempt a dynamic load from flags if need be """
85 if name in self._children : return self._children[name]
86 if self._root :
87 if self._root._loadflags( f"{self.name()}.{name}" ) :
88 if name in self._children : return self._children[name]
89 if name in self._root._children : return self._root._children[name]
90 if self._root._loadflags( name ) :
91 if name in self._root._children : return self._root._children[name]
92 else:
93 if self._loadflags( name ) :
94 if name in self._children : return self._children[name]
95
96 raise AttributeError(f"no attribute {name}")
97

◆ __getattribute__()

python.Node.Node.__getattribute__ ( self,
name )

Definition at line 76 of file Node.py.

76 def __getattribute__(self, name):
77 value = object.__getattribute__(self, name)
78 if type(value).__name__ == "CfgFlag":
79 flags = object.__getattribute__(self, "_flags")
80 return value.get(flags)
81 return value
82

◆ __setattr__()

python.Node.Node.__setattr__ ( self,
name,
value )

Definition at line 67 of file Node.py.

67 def __setattr__(self, name, value):
68 self._fail_if_locked()
69 if name in self._children : raise AttributeError(f"node {name} already exists")
70 current = self.__dict__.get(name)
71 if type(current).__name__ == "CfgFlag":
72 current.set(value)
73 else:
74 object.__setattr__(self, name, value)
75
T * get(TKey *tobj)
get a TObject* from a TKey* (why can't a TObject be a TKey?)
Definition hcg.cxx:132

◆ _addDynaFlags()

python.Node.Node._addDynaFlags ( self,
name )
protected

Definition at line 155 of file Node.py.

155 def _addDynaFlags(self, name) :
156 flags = self._flags
157 self._flags._loadDynaFlags(name)
158 return self._stragglers(flags)
159

◆ _addFlagImpl()

python.Node.Node._addFlagImpl ( self,
tag,
value,
flags = None,
unlock = False )
protected
addFlag method like that in the egregious flags 

Definition at line 182 of file Node.py.

182 def _addFlagImpl(self, tag, value, flags=None, unlock=False):
183 """ addFlag method like that in the egregious flags """
184 node = self
185 if flags is not None and self._flags is None : node._flags = flags
186 names = tag.split(".")
187 for name in names[:-1]:
188 node = node._addNewNode(name, flags )
189 if unlock : object.__setattr__( node, "_lockstate", _UNLOCKED )
190 if flags is not None : node._flags = flags
191 if names[-1] in node.__dict__ : return False
192 # just use a value at the moment, can use CfgFlag(value, type) if we really have to(
193 setattr(node, names[-1], value)
194 return True
195

◆ _addFlagUnlock()

python.Node.Node._addFlagUnlock ( self,
tag,
value,
flags = None )
protected

Definition at line 200 of file Node.py.

200 def _addFlagUnlock(self, tag, value, flags=None):
201 self._addFlagImpl( tag, value, flags, True )
202

◆ _addNewNode()

python.Node.Node._addNewNode ( self,
str name,
flags = None )
protected
add a new child node 

Definition at line 208 of file Node.py.

208 def _addNewNode(self, name : str, flags=None):
209 """ add a new child node """
210 self._fail_if_locked()
211 if name in self.__dict__: raise AttributeError(f"attribute {name} already exists")
212 rootnode = self._rootnode()
213 if name not in self._children :
214 self._children[name] = ( node := Node(name, root=rootnode) )
215 if flags is not None : node._flags = flags
216 return self._children[name]
217

◆ _addNode()

python.Node.Node._addNode ( self,
node )
protected
an en existing node as a child node 

Definition at line 218 of file Node.py.

218 def _addNode(self, node ):
219 """ an en existing node as a child node """
220 self._fail_if_locked()
221 name = node.name()
222 if name in self.__dict__: raise AttributeError(f"attribute {name} already exists")
223 rootnode = self._rootnode()
224 if name not in self._children :
225 if node._root and rootnode is not node._root :
226 raise RuntimeError(f"cannot add node {name} from a different tree")
227 self._children[node.name()] = node
228 if not node._root : node._setrootnode( rootnode )
229 return self._children[node.name()]
230
void name(const std::string &n)
Definition node.h:40

◆ _fail_if_locked()

python.Node.Node._fail_if_locked ( self)
protected

Definition at line 132 of file Node.py.

132 def _fail_if_locked(self):
133 if self._lockstate == _LOCKED : raise RuntimeError(f"Node {self._name} is locked; ")
134 if self._lockstate == _LOCKED_FOREVER : raise RuntimeError(f"Node {self._name} is permanently locked; ")
135

◆ _fail_if_locked_forever()

python.Node.Node._fail_if_locked_forever ( self)
protected

Definition at line 129 of file Node.py.

129 def _fail_if_locked_forever(self):
130 if self._lockstate == _LOCKED_FOREVER : raise RuntimeError(f"Node {self._name} is permanently locked; ")
131

◆ _hasFlagPath()

python.Node.Node._hasFlagPath ( self,
name )
protected

Definition at line 241 of file Node.py.

241 def _hasFlagPath(self, name):
242 parts = name.split('.')
243 node = self._rootnode()
244 for part in parts[:-1]:
245 if not node.hasNode(part) : return False
246 node = node.node(part)
247 return node.hasFlag(parts[-1])
248
node(node *n=0, const std::string &d="", TObject *t=0)
Definition node.h:32

◆ _loadflags()

python.Node.Node._loadflags ( self,
name )
protected
load dynamic flags - can only load flags on the root node 

Definition at line 136 of file Node.py.

136 def _loadflags(self, name ) :
137 """ load dynamic flags - can only load flags on the root node """
138
139 if self._root : return self._root._loadflags( name )
140
141 flags = self._flags
142 if flags is None : raise AttributeError(f"no attribute {name}")
143 lockstate = self._lockstate
144 object.__setattr__(self, "_lockstate", _UNLOCKED)
145 try:
146 if name in flags._loaded : return self._stragglers(flags)
147 if name in flags._dynaflags : return self._addDynaFlags(name)
148 for key in flags._dynaflags :
149 if name in key : return self._addDynaFlags(key)
150 return False
151 finally:
152 # ensure the lock state is restored if something goes wrong ...
153 if lockstate != _UNLOCKED : self.lock(lockstate)
154

◆ _rootnode()

python.Node.Node._rootnode ( self)
protected

Definition at line 166 of file Node.py.

166 def _rootnode(self):
167 if self._root : return self._root
168 return self
169

◆ _setrootnode()

python.Node.Node._setrootnode ( self,
rootnode )
protected

Definition at line 170 of file Node.py.

170 def _setrootnode(self, rootnode ):
171 if self._root is rootnode : return
172 object.__setattr__(self, "_root", rootnode )
173 for node in self.nodes() : node._setrootnode(rootnode)
174

◆ _stragglers()

python.Node.Node._stragglers ( self,
flags,
dbg = "" )
protected

Definition at line 160 of file Node.py.

160 def _stragglers(self, flags, dbg="") :
161 for key, val in self._flags._flagdict.items() :
162 if self._hasFlagPath(key) : continue
163 self._addFlagUnlock( key, val, flags )
164 return True
165

◆ add()

python.Node.Node.add ( self,
attr_name,
value )
add an attribute to this node 

Definition at line 178 of file Node.py.

178 def add(self, attr_name, value):
179 """ add an attribute to this node """
180 setattr(self, attr_name, value)
181
bool add(const std::string &hname, TKey *tobj)
Definition fastadd.cxx:55

◆ addFlag()

python.Node.Node.addFlag ( self,
tag,
value,
flags = None )

Definition at line 196 of file Node.py.

196 def addFlag(self, tag, value, flags=None):
197 if not self._addFlagImpl( tag, value, flags, False ):
198 raise KeyError(f"flag {tag} already exists")
199

◆ addNode()

python.Node.Node.addNode ( self,
item,
flags = None )

Definition at line 203 of file Node.py.

203 def addNode( self, item, flags=None):
204 if isinstance(item, Node) : return self._addNode(item)
205 if isinstance(item, str) : return self._addNewNode(item, flags)
206 raise TypeError(f"Cannot construct node from type {type(item).__name__}, value {item}")
207

◆ clone()

python.Node.Node.clone ( self,
name = None )
Return an independent copy" of this node

Definition at line 276 of file Node.py.

276 def clone(self, name=None):
277 """Return an independent copy" of this node"""
278
279 if name is not None : newnode = Node(name)
280 else: newnode = Node(self._name)
281
282 for key, value in self.__dict__.items():
283 if key in {"_name", "_children", "_lockstate", "_root" } : continue
284 setattr(newnode, key, value)
285
286 for node in self.nodes():
287 child = node.clone()
288 child._root = None
289 newnode._addNode(child)
290
291 return newnode
292
293

◆ cloneAndReplace()

python.Node.Node.cloneAndReplace ( self,
targetname,
flagname )

Definition at line 307 of file Node.py.

307 def cloneAndReplace(self, targetname, flagname ) :
308 # we really, really, should not have this ...
309 warnings.warn( "cloneAndReplace() is unnecessary for Node flags; "
310 "use the appropriate Node directly",
311 RuntimeWarning, stacklevel=2 )
312 # eventually, instead of delegation, should raise an exception ...
313 # raise RuntimeError( "cloneAndReplace() should not be used for node flags" )
314 return self._rootnode()._flags.cloneAndReplace( targetname, flagname )
315
316

◆ delete()

python.Node.Node.delete ( self,
name )

Definition at line 261 of file Node.py.

261 def delete(self, name):
262 self._fail_if_locked()
263 if name in self._children : del self._children[name]
264 elif name in self.__dict__ : object.__delattr__(self, name) # delattr( self, name )
265 else : raise AttributeError(f"Node {self._name} has no member {name}")
266

◆ dump()

python.Node.Node.dump ( self)

Definition at line 304 of file Node.py.

304 def dump(self): self.print()
305
306
void print(char *figname, TCanvas *c1)
-event-from-file

◆ has()

python.Node.Node.has ( self,
name,
value = None )

Definition at line 231 of file Node.py.

231 def has(self, name, value=None ):
232 if value is None : return hasattr( self, name )
233 return hasattr( self, name ) and getattr( self, name ) == value
234

◆ hasFlag()

python.Node.Node.hasFlag ( self,
name )

Definition at line 235 of file Node.py.

235 def hasFlag(self, name ):
236 return name in self.__dict__
237

◆ hasNode()

python.Node.Node.hasNode ( self,
name )

Definition at line 238 of file Node.py.

238 def hasNode(self, name):
239 return name in self._children
240

◆ islocked()

python.Node.Node.islocked ( self)

Definition at line 123 of file Node.py.

123 def islocked(self):
124 return self._lockstate != _UNLOCKED
125

◆ lock()

python.Node.Node.lock ( self,
lockstate = _LOCKED )

Definition at line 110 of file Node.py.

110 def lock(self, lockstate=_LOCKED):
111 for node in self.nodes() : node.lock(lockstate)
112 object.__setattr__(self, "_lockstate", lockstate)
113
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.

◆ lock_forever()

python.Node.Node.lock_forever ( self)

Definition at line 120 of file Node.py.

120 def lock_forever(self):
121 self.lock(_LOCKED_FOREVER)
122

◆ locked()

python.Node.Node.locked ( self)

Definition at line 126 of file Node.py.

126 def locked(self):
127 return self.islocked()
128

◆ name()

python.Node.Node.name ( self)

Definition at line 175 of file Node.py.

175 def name(self) :
176 return self._name
177

◆ node()

python.Node.Node.node ( self,
name )

Definition at line 257 of file Node.py.

257 def node(self, name):
258 if self.hasNode(name) : return self._children[name]
259 raise RuntimeError(f"So such child: {name}")
260
Definition node.h:24

◆ node_flags()

python.Node.Node.node_flags ( self)

Definition at line 252 of file Node.py.

252 def node_flags(self):
253 for key, value in self.__dict__.items():
254 if not key.startswith("_"):
255 yield key, getattr(self, key)
256

◆ nodes()

python.Node.Node.nodes ( self)

Definition at line 249 of file Node.py.

249 def nodes(self):
250 return self._children.values()
251

◆ print()

python.Node.Node.print ( self,
spacer = "" )

Definition at line 294 of file Node.py.

294 def print(self, spacer=""):
295 print( f"{spacer}{self._name} (Node)" )
296 if spacer=="" : spacer = "|__ "
297 else: spacer=f" {spacer}"
298 for key, value in self.__dict__.items():
299 if key in {"_name","_children","_lockstate", "_flags", "_root"} : continue
300 print( f"{spacer}{key}\t: {value}" )
301 for node in self.nodes() : node.print( spacer )
302
303

◆ rename()

python.Node.Node.rename ( self,
name,
newname )

Definition at line 267 of file Node.py.

267 def rename( self, name, newname ):
268 if newname in self._children or newname in self.__dict__ :
269 raise RuntimeError(f"name {newname} already in node")
270
271 if name in self.__dict__: setattr(self, newname, self.__dict__.pop(name) )
272 elif name in self._children :
273 self._children[newname] = ( node := self._children.pop(name) )
274 node._name = newname
275

◆ unlock()

python.Node.Node.unlock ( self)

Definition at line 114 of file Node.py.

114 def unlock(self):
115 self._fail_if_locked_forever()
116 if self._lockstate == _LOCKED:
117 object.__setattr__(self, "_lockstate", _UNLOCKED)
118 for node in self.nodes(): node.unlock()
119

Member Data Documentation

◆ __dict__

raise AttributeError(f) python.Node.Node.__dict__
private

Definition at line 211 of file Node.py.

◆ _children

raise AttributeError(f) python.Node.Node._children
protected

Definition at line 69 of file Node.py.

◆ _lockstate

python.Node.Node._lockstate = _LOCKED:
protected

Definition at line 116 of file Node.py.

◆ _root

return self._root._loadflags( name ) python.Node.Node._root
protected

Definition at line 86 of file Node.py.


The documentation for this class was generated from the following file: