26def genericAssembler(dataId, componentInfo, cls):
27 """A generic assembler for butler composite datasets, that can be used when the component names match the
28 argument names in the __init__ signature,
or the setter name
for component objects
is specified
or can be
29 inferred by component name.
31 When determining setter names: If the setter name
is specified by the policy then the genericAssembler
32 will use that to set the component into the python object. If the policy does
not specify setter names the
33 genericAssembler will see
if the __init__ func input argument names match the policy argument names. If
34 that does
not work,
and the python object has setter names that match the component name of all the object
35 then the setter name can be inferred; it will first
try 'set' + <componentName>,
and if that does
not
36 exist it will
try 'set' + <componentName>.capitalize (e.g.
for component name
'foo', it will
try setfoo
37 and then setFoo.) If no setter can be found
for a component object, it will
raise a runtime error.
39 initArgs = {k: v.obj for k, v
in componentInfo.items()}
47 for componentName, componentInfo
in componentInfo.items():
48 if componentInfo.setter
is not None:
49 setter = getattr(obj, componentInfo.setter)
50 elif hasattr(obj,
'set_' + componentName):
51 setter = getattr(obj,
'set_' + componentName)
52 elif hasattr(obj,
'set' + componentName.capitalize()):
53 setter = getattr(obj,
'set' + componentName.capitalize())
55 raise RuntimeError(
"No setter for datasetType:%s class:%s" %
56 (componentInfo.datasetType, cls))
57 setter(componentInfo.obj)
61def genericDisassembler(obj, dataId, componentInfo):
62 """A generic disassembler for butler composite datasets, that can be used when the getter name for
63 component objects is specified
or can be inferred by component name.
65 When determining getter names: If the getter name
is specified by the policy then the genericAssembler
66 will use that to get the component
from the python object. If the policy does
not specify getter names
and
67 the python object has getter names that match the component name of all the object then the getter name
68 can be inferred; it will first
try 'get' + <componentName>,
and if that does
not exist it will
try 'get' +
69 <componentName>.capitalize (e.g.
for component name
'foo', it will
try getfoo
and then getFoo.) If no
70 getter can be found
for a component object, it will
raise a runtime error.
72 for componentName, componentInfo
in componentInfo.items():
73 if componentInfo.getter
is not None:
74 getter = getattr(obj, componentInfo.getter)
75 elif hasattr(obj,
'get_' + componentName):
76 getter = getattr(obj,
'get_' + componentName)
77 elif hasattr(obj,
'get' + componentName.capitalize()):
78 getter = getattr(obj,
'get' + componentName.capitalize())
80 raise RuntimeError(
"No getter for componentName:%s" % componentName)
81 componentInfo.obj = getter()