从 Hydra 中的配置组中选择多个配置,而无需在每个配置中使用显式嵌套级别

Selecting multiple configs from a Config Group in Hydra without using an explicit nesting level inside each of the configs

https://hydra.cc/docs/patterns/select_multiple_configs_from_config_group/ 中的文档展示了如何从配置组中选取多个配置并将它们放置在类似字典的结构中。

但是,正如在最后一段中提到的,“示例在每个配置中使用了一个显式嵌套级别来防止它们相互跨越”。 对于我的用例,这将证明非常麻烦,如果可能,我想不惜一切代价避免它。

有没有一种方法可以在不显式地在各个配置中添加关卡的情况下获得类似的结果?提前致谢:)

您可以使用 defaults-list @package keyword 来获得类似的结果。

假设您已将 yaml 文件 server/site/fb.yamlserver/site/google.yaml 更改为不包含“显式嵌套”,例如server/site/fb.yaml 仅包含数据 domain: facebook.com.

您可以使用 server/apache.yaml` 中的以下默认列表实现与文档网页相同的输出:

# Option 1: With a non-overridable defaults list
defaults:
  - site/fb@site.fb
  - site/google@site.google
# Option 2: With an overridable defaults list
defaults:
  - site@site.fb: fb
  - site@site.google: google

上面的选项 1 或选项 2 都会产生此输出:

$ python my_app.py
server:
  site:
    fb:
      domain: facebook.com
    google:
      domain: google.com
  host: localhost
  port: 443

此处的 @package 指令可以是您想要的任何复合键。例如,使用以下默认列表:

# Option 1: With a non-overridable defaults list
defaults:
  - site/fb@foo
  - site/google@bar
# Option 2: With an overridable defaults list
defaults:
  - site@foo: fb
  - site@bar: google

我们得到这个结果:

$ python my_app.py
server:
  foo:
    domain: facebook.com
  bar:
    domain: google.com
  host: localhost
  port: 443

使用选项 2(可覆盖的默认值列表)意味着您可以使用 CLI 覆盖给定的默认选项:

$ python my_app.py server/site@server.foo=amazon
server:
  foo:
    domain: amazon.com
  bar:
    domain: google.com
  host: localhost
  port: 443