File size: 2,877 Bytes
9c6594c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
from typing import Any
from omegaconf import MISSING, Container, DictConfig, ListConfig, Node, ValueNode
from omegaconf.errors import ConfigTypeError, InterpolationToMissingValueError
from ._utils import _DEFAULT_MARKER_, _get_value
def _resolve_container_value(cfg: Container, key: Any) -> None:
node = cfg._get_child(key)
assert isinstance(node, Node)
if node._is_interpolation():
try:
resolved = node._dereference_node()
except InterpolationToMissingValueError:
node._set_value(MISSING)
else:
if isinstance(resolved, Container):
_resolve(resolved)
if isinstance(resolved, Container) and isinstance(node, ValueNode):
cfg[key] = resolved
else:
node._set_value(_get_value(resolved))
else:
_resolve(node)
def _resolve(cfg: Node) -> Node:
assert isinstance(cfg, Node)
if cfg._is_interpolation():
try:
resolved = cfg._dereference_node()
except InterpolationToMissingValueError:
cfg._set_value(MISSING)
else:
cfg._set_value(resolved._value())
if isinstance(cfg, DictConfig):
for k in cfg.keys():
_resolve_container_value(cfg, k)
elif isinstance(cfg, ListConfig):
for i in range(len(cfg)):
_resolve_container_value(cfg, i)
return cfg
def select_value(
cfg: Container,
key: str,
*,
default: Any = _DEFAULT_MARKER_,
throw_on_resolution_failure: bool = True,
throw_on_missing: bool = False,
absolute_key: bool = False,
) -> Any:
node = select_node(
cfg=cfg,
key=key,
throw_on_resolution_failure=throw_on_resolution_failure,
throw_on_missing=throw_on_missing,
absolute_key=absolute_key,
)
node_not_found = node is None
if node_not_found or node._is_missing():
if default is not _DEFAULT_MARKER_:
return default
else:
return None
return _get_value(node)
def select_node(
cfg: Container,
key: str,
*,
throw_on_resolution_failure: bool = True,
throw_on_missing: bool = False,
absolute_key: bool = False,
) -> Any:
try:
# for non relative keys, the interpretation can be:
# 1. relative to cfg
# 2. relative to the config root
# This is controlled by the absolute_key flag. By default, such keys are relative to cfg.
if not absolute_key and not key.startswith("."):
key = f".{key}"
cfg, key = cfg._resolve_key_and_root(key)
_root, _last_key, node = cfg._select_impl(
key,
throw_on_missing=throw_on_missing,
throw_on_resolution_failure=throw_on_resolution_failure,
)
except ConfigTypeError:
return None
return node
|