Source code for archai.quantization.quantization_utils
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
import functools
from typing import Any
[docs]def rgetattr(obj: Any, attr: str, *args) -> Any:
"""Recursively get an attribute from an object.
This function allows accessing nested attributes by separating each level with a dot (e.g., "attr1.attr2.attr3").
If any attribute along the chain does not exist, the function returns the default value
specified in the `*args` parameter.
Args:
obj: Object from which the attribute will be retrieved.
attr: Name of the attribute to be retrieved, with each level separated by a dot.
Returns:
Attribute from the object.
Example:
>>> obj = MyObject()
>>> rgetattr(obj, "attr1.attr2.attr3")
Reference:
https://stackoverflow.com/questions/31174295/getattr-and-setattr-on-nested-subobjects-chained-properties/31174427#31174427
"""
def _getattr(obj: Any, attr: Any) -> Any:
return getattr(obj, attr, *args)
return functools.reduce(_getattr, [obj] + attr.split("."))
[docs]def rsetattr(obj: Any, attr: str, value: Any) -> None:
"""Recursively set an attribute on an object.
This function allows setting nested attributes by separating each level with a dot (e.g., "attr1.attr2.attr3").
Args:
obj: Object on which the attribute will be set.
attr: Name of the attribute to be set, with each level separated by a dot.
value: New value for the attribute.
Example:
>>> obj = MyObject()
>>> rsetattr(obj, "attr1.attr2.attr3", new_value)
Reference:
https://stackoverflow.com/questions/31174295/getattr-and-setattr-on-nested-subobjects-chained-properties/31174427#31174427
"""
pre_attr, _, post_attr = attr.rpartition(".")
return setattr(rgetattr(obj, pre_attr) if pre_attr else obj, post_attr, value)