2

假设我的代码中有一个抽象类db,并且类db1, db1, ...db1继承自db. 我的项目使用hydra并具有以下结构:

├── my_app.py
├── conf.yaml
└── db
    ├── db1.yaml
    ├── db2.yaml
    └── db3.yaml

我需要一个列表,db所以我想得到一个像这样的最终配置文件:

db:
  -
    param1_of_db1: key_1_1
    param2_of_db1: key_1_2
  -
    param1_of_db2: key_2_1
    param2_of_db2: key_2_2
  -
    param1_of_db3: key_3_1
    param2_of_db3: key_3_2

所以这dbdb1, db2,的参数列表db3。在conf.yaml文件中,我想像:

defaults:
  - db: [db1, db2, db3]

有没有办法做这样的事情?

4

2 回答 2

4

Hydra 不支持您的要求。

  1. 不支持列表组合,列表在组合过程中是全部或全部。
  2. 配置组是互斥的,有一个功能要求放宽它。

不过,您可以接近它(无法从命令行覆盖结构,例如:config.yaml:

defaults:
  - db/db1
  - db/db2
  - db/db3

此处记录了此语法。

在每个 db 配置文件中,您可以执行以下操作:

db/db1.yaml:

# @pacakge _group_._name_
host: localhost
port: 3306

包覆盖记录在这里

生成的配置如下所示:

db:       # from the config group of the corresponding config (path)
  db1:    # from the name of the corresponding config
    host: localhost
    port: 3306
  db2:
    ...
于 2020-11-12T17:45:25.143 回答
0

您可以非常接近与最新的 hydra/omegaconf 合并列表

诀窍是字典是组合的,因此您可以在字典中组合配置,然后使用新的oc.dict.values插值来获取最终列表。

所以在你的情况下,它会是这样的:

defaults:
  - dbs/db1
  - dbs/db2
  - dbs/db3

db: ${oc.dict.values:dbs}

请注意,我已将“db”包重命名为“dbs”。所以最终解决的配置看起来像:

dbs:
  db1:    
    host: localhost
    port: 3306
  db2:
    host: localhost
    port: 3307
  db3:
    host: localhost
    port: 3308

db:
  - host: localhost
    port: 3306
  - host: localhost
    port: 3307
  - host: localhost
    port: 3308

“dbs”包的键不用于任何用途,但我发现它实际上使配置更清晰地拥有它们。

于 2021-06-06T16:19:43.840 回答