3

如何将 OmegaConf自定义插值Hydra一起使用?

一些背景:可以为平方根定义自定义插值:

from omegaconf import OmegaConf
import math
OmegaConf.register_resolver("sqrt", lambda x: math.sqrt(float(x)))

并将其与此 config.yaml 一起使用:

foo: ${sqrt:9}

加载和打印 foo:

cfg = OmegaConf.load('config.yaml')
print(cfg.foo)

输出3.0

尝试使用 Hydra 时:

import hydra

@hydra.main(config_path="config.yaml")
def main(cfg):
  print(cfg.foo)

if __name__ == "__main__":
  main()

我收到以下错误:

Unsupported interpolation type sqrt
    full_key: foo
    reference_type=Optional[Dict[Any, Any]]
    object_type=dict

使用 Hydra 时如何注册我的解析器?

4

1 回答 1

10

您可以提前注册自定义解析器:

配置.yaml:

foo: ${sqrt:9}

主要.py:

from omegaconf import OmegaConf
import math
import hydra

OmegaConf.register_new_resolver("sqrt", lambda x: math.sqrt(float(x)))

@hydra.main(config_path=".", config_name="config")
def main(cfg):
  print(cfg.foo)

if __name__ == "__main__":
  main()

这将打印 3.0。

这种方法同样适用于Compose API。当您访问节点(懒惰地)时,就会对自定义解析器进行评估。您只需要在访问它之前注册解析器。

于 2020-05-11T18:27:33.020 回答