|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
from typing import Any, Dict, List, Union |
|
|
|
from omegaconf import OmegaConf |
|
from omegaconf.base import DictKeyType, SCMode |
|
from omegaconf.dictconfig import DictConfig |
|
|
|
|
|
def to_object(cfg: Any) -> Union[Dict[DictKeyType, Any], List[Any], None, str, Any]: |
|
""" |
|
Converts an OmegaConf configuration object to a native Python container (dict or list), unless |
|
the configuration is specifically created by LazyCall, in which case the original configuration |
|
is returned directly. |
|
|
|
This function serves as a modification of the original `to_object` method from OmegaConf, |
|
preventing DictConfig objects created by LazyCall from being automatically converted to Python |
|
dictionaries. This ensures that configurations meant to be lazily evaluated retain their intended |
|
structure and behavior. |
|
|
|
Differences from OmegaConf's original `to_object`: |
|
- Adds a check at the beginning to return the configuration unchanged if it is created by LazyCall. |
|
|
|
Reference: |
|
- Original OmegaConf `to_object` method: https://github.com/omry/omegaconf/blob/master/omegaconf/omegaconf.py#L595 |
|
|
|
Args: |
|
cfg (Any): The OmegaConf configuration object to convert. |
|
|
|
Returns: |
|
Union[Dict[DictKeyType, Any], List[Any], None, str, Any]: The converted Python container if |
|
`cfg` is not a LazyCall created configuration, otherwise the unchanged `cfg`. |
|
|
|
Examples: |
|
>>> cfg = DictConfig({"key": "value", "_target_": "Model"}) |
|
>>> to_object(cfg) |
|
DictConfig({"key": "value", "_target_": "Model"}) |
|
|
|
>>> cfg = DictConfig({"list": [1, 2, 3]}) |
|
>>> to_object(cfg) |
|
{'list': [1, 2, 3]} |
|
""" |
|
if isinstance(cfg, DictConfig) and "_target_" in cfg.keys(): |
|
return cfg |
|
|
|
return OmegaConf.to_container( |
|
cfg=cfg, |
|
resolve=True, |
|
throw_on_missing=True, |
|
enum_to_str=False, |
|
structured_config_mode=SCMode.INSTANTIATE, |
|
) |
|
|