Hydra 在配置中组合列表

Hydra combine lists in config

假设我有以下 hydra 配置 test.yaml:

list1 : [0]
list2 : [1,2,3]

是否可以将 list1list2 合并到包含 [0,1,2,3] 的新列表中,也许使用变量插值?

这是九头蛇代码:

import hydra
from omegaconf import OmegaConf
@hydra.main(config_name="test.yaml", config_path="./")
def main(cfg):
    OmegaConf.resolve(cfg)
    print(cfg)
if __name__ == "__main__":
    main()

尝试(失败):

list1 : [0]
list2 : [1,2,3]
list3 : 
  - ${list1} 
  - ${list2}

list3 给出 [0,[1,2,3]]

我想要这个的原因是因为我在其他配置文件中有一些长度未知的列表,我想合并它们以创建对象创建的参数。我不希望在代码中这样做,而是直接依赖 hydras 对象实例化(否则我将在任何地方进行列表合并!)。

事实证明这并不太难,确实可以依靠带有自定义解析器的 OmegaConfs 变量插值。

import hydra
from omegaconf import OmegaConf
# custom list merge resolver
OmegaConf.register_new_resolver("merge", lambda x, y : x + y)

@hydra.main(config_name="test.yaml", config_path="./")
def main(cfg):
    OmegaConf.resolve(cfg)
    print(cfg)

if __name__ == "__main__":
    main()

配置文件test.yaml

list1 : [0]
list2 : [1,2,3]

list3 : ${merge:${list1},${list2}}

list3 现在是 [0,1,2,3],如您所愿。