0

是否可以使用结构化配置定义目标以避免重新定义所有参数?

def good(config: Config):
 pass

def bad(param1, param2):
 pass

@dataclass
class Config:
 param1
 param2
 _target_: Any = good
 # _target_: Any = bad
 # _target_: str = 'Config.also_good'

 def also_good(self):
   pass

_target_如果是类、函数或方法,我应该使用什么类型的注释?当我使用任何我得到的

omegaconf.errors.UnsupportedValueType: Value 'function' is not a supported primitive type
    full_key: _target_
4

1 回答 1

1

_target_类型应该str是. 这是一个使用带有结构化配置的instantiateAPI的示例:

# example.py
from dataclasses import dataclass

from hydra.utils import instantiate


def trgt(arg1: int, arg2: float):
    print(f"trgt function: got {arg1}, {arg2}")
    return "foobar"


@dataclass
class Config:
    _target_: str = "__main__.trgt"  # dotpath describing location of callable
    arg1: int = 123
    arg2: float = 10.1


val = instantiate(Config)
print(f"Returned value was {val}.")

运行脚本:

$ python example.py
trgt function: got 123, 10.1
Returned value was foobar.

笔记:

  • _target_字段必须是描述用于查找可调用对象的“dotpath”的字符串(__main__.trgt在上面的示例中)。其他典型的点路径是my_module.my_function,builtins.range numpy.random.randn等。该instantiate函数使用此点路径来查找将被实例化的可调用对象(trgt在此示例中为函数)。
  • 结构化配置的字段(除了字段和其他特殊保留字段,_target_例如和)将作为关键字参数传递给查找的可调用对象。在此示例中,该函数使用关键字参数和调用。这相当于python代码。_recursive__convert__args_trgtarg1=123arg2=10.1trgt(arg1=123, arg2=10.1)
  • 如果您定义结构化配置(使用@dataclassor @attr.s),您可以为每个字段指定默认值。例如,arg1上面字段的默认值为123. 如果缺少任何值的字段,调用instantiate(config)将导致异常。config通常,结构化配置的缺失值将在 Hydra 的配置组合过程中被填充。

参考:

于 2022-01-31T02:34:22.840 回答