Skip to content

[Bug] compose AssertionError on key pointing into None-valued DictConfig. #2502

@Jasha10

Description

@Jasha10

🐛 Bug

Description

Composing a config throws an AssertionError in some circumstances where there is a DictConfig whose _content is None.

To reproduce

Run the following script to confirm that an AssertionError is raised:

from dataclasses import dataclass
from typing import Optional

from hydra import compose, initialize
from hydra.core.config_store import ConfigStore
# from pytest import raises


@dataclass
class Child:
    field: bool | int = True


@dataclass
class Parent:
    child: Optional[Child] = None


cs = ConfigStore.instance()
cs.store(name="schema", node=Parent)
cs.store(group="grp", name="option", node={"child": {}}, package="_global_")

# with raises(AssertionError):
with initialize(version_base=None):
    compose(config_name="schema", overrides=["+grp=option"])
Here is the full traceback:
Traceback (most recent call last):
  File "/home/homestar/dev/mrepo/pysc/repro.py", line 25, in <module>
    compose(config_name="schema", overrides=["+grp=option"])
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/hydra/compose.py", line 34, in compose
    cfg = gh.hydra.compose_config(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/hydra/_internal/hydra.py", line 594, in compose_config
    cfg = self.config_loader.load_configuration(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/hydra/_internal/config_loader_impl.py", line 142, in load_configuration
    return self._load_configuration_impl(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/hydra/_internal/config_loader_impl.py", line 263, in _load_configuration_impl
    cfg = self._compose_config_from_defaults_list(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/hydra/_internal/config_loader_impl.py", line 542, in _compose_config_from_defaults_list
    cfg.merge_with(loaded.config)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 490, in merge_with
    self._format_and_raise(key=None, value=None, cause=e)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/base.py", line 231, in _format_and_raise
    format_and_raise(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 488, in merge_with
    self._merge_with(*others)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 512, in _merge_with
    BaseContainer._map_merge(self, other)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 378, in _map_merge
    expand(dest_node)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 342, in expand
    node._set_value(val)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 647, in _set_value
    raise e
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 644, in _set_value
    self._set_value_impl(value, flags)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 677, in _set_value_impl
    self.__setitem__(k, v)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 314, in __setitem__
    self._format_and_raise(key=key, value=value, cause=e)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/base.py", line 231, in _format_and_raise
    format_and_raise(
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 308, in __setitem__
    self.__set_impl(key=key, value=value)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/dictconfig.py", line 318, in __set_impl
    self._set_item_impl(key, value)
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/basecontainer.py", line 533, in _set_item_impl
    if self._get_root() is value._get_root():
  File "/home/homestar/miniconda3/envs/pysc/lib/python3.10/site-packages/omegaconf/base.py", line 289, in _get_root
    assert isinstance(self, Container)
AssertionError

Expected Behavior

No AssertionError, the call to compose should return a config that looks like Parent(Child()).

System information

  • Hydra Version : 1.3.0
  • Python version : 3.10.8

Additional context

This feels related to omry/omegaconf#1035, though it might not be the exact same code path.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions