问题描述
假设我的代码中有一个抽象类db
,并且类db1
,db1
,... db1
继承自db
。
我的项目使用hydra并具有以下结构:
├── my_app.py
├── conf.yaml
└── db
├── db1.yaml
├── db2.yaml
└── db3.yaml
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
,因此db
是db1
,db2
,db3
的参数列表。
在conf.yaml
文件中,我想像这样:
defaults:
- db: [db1,db2,db3]
有没有办法做类似的事情?
解决方法
Hydra不支持您的要求。
- 不支持列表组合,列表在组合过程中全部或全部不提供。
- 配置组是互斥的,有一个feature request可以缓解这种情况。
尽管如此,您仍然可以接近它(无法从命令行覆盖结构就像: config.yaml:
defaults:
- db/db1
- db/db2
- db/db3
此语法已记录在here中。
在每个数据库配置文件中,您都可以执行以下操作:
db / db1.yaml:
# @pacakge _group_._name_
host: localhost
port: 3306
打包替代记录在here中。
结果配置如下:
db: # from the config group of the corresponding config (path)
db1: # from the name of the corresponding config
host: localhost
port: 3306
db2:
...
,
您可以非常接近与最新的 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”包的键不用于任何用途,但我发现它实际上使配置更清晰。