Spaces:
Build error
Build error
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved. | |
# SPDX-License-Identifier: Apache-2.0 | |
# | |
# Licensed under the Apache License, Version 2.0 (the "License"); | |
# you may not use this file except in compliance with the License. | |
# You may obtain a copy of the License at | |
# | |
# http://www.apache.org/licenses/LICENSE-2.0 | |
# | |
# Unless required by applicable law or agreed to in writing, software | |
# distributed under the License is distributed on an "AS IS" BASIS, | |
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
# See the License for the specific language governing permissions and | |
# limitations under the License. | |
from typing import Any, Dict, List, Union | |
from omegaconf import OmegaConf | |
from omegaconf.base import DictKeyType, SCMode | |
from omegaconf.dictconfig import DictConfig # pragma: no cover | |
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, | |
) | |