Spaces:
Runtime error
Runtime error
def extend_instance(obj, mixin): | |
"""Apply mixins to a class instance after creation""" | |
base_cls = obj.__class__ | |
base_cls_name = obj.__class__.__name__ | |
obj.__class__ = type( | |
base_cls_name, (mixin, base_cls), {} | |
) # mixin needs to go first for our forward() logic to work | |
def getattr_recursive(obj, att): | |
""" | |
Return nested attribute of obj | |
Example: getattr_recursive(obj, 'a.b.c') is equivalent to obj.a.b.c | |
""" | |
if att == "": | |
return obj | |
i = att.find(".") | |
if i < 0: | |
return getattr(obj, att) | |
else: | |
return getattr_recursive(getattr(obj, att[:i]), att[i + 1 :]) | |
def setattr_recursive(obj, att, val): | |
""" | |
Set nested attribute of obj | |
Example: setattr_recursive(obj, 'a.b.c', val) is equivalent to obj.a.b.c = val | |
""" | |
if "." in att: | |
obj = getattr_recursive(obj, ".".join(att.split(".")[:-1])) | |
setattr(obj, att.split(".")[-1], val) | |
def apply_with_stopping_condition( | |
module, apply_fn, apply_condition=None, stopping_condition=None, **other_args | |
): | |
if stopping_condition(module): | |
return | |
if apply_condition(module): | |
apply_fn(module, **other_args) | |
for child in module.children(): | |
apply_with_stopping_condition( | |
child, | |
apply_fn, | |
apply_condition=apply_condition, | |
stopping_condition=stopping_condition, | |
**other_args | |
) |