python,Hydra,从YAML到列表的负载变量

发布于 2025-01-29 05:51:29 字数 980 浏览 2 评论 0原文

我得到了一个以下代码:

# settings.yaml

my_class:
  columns_id: ${oc.env:MY_LIST}
  all_columns: {"all_columns_as_str": ${oc.env:MY_LIST}}

我的变量为my_list = a,b,c

,然后我得到:

# hydra_conf.py

from dataclasses import dataclass

@dataclass
class MyClass:
  columns_id: list
  all_columns: dict[str, str]

然后我使用所有这些都像下面:

# main.py
import hydra
from hydra_conf import MyClass

@hydra.main(config_path="settings", config_name="settings")
def main(cfg: MyClass) -> None:
    assert isinstance(cfg.columns_id, list)
    assert isinstance(cfg.all_columns, dict)
    assert cfg.all_columns['all_columns_as_str'] == 'a,b,c'

我需要如何配置yml.file < /code>或我的hydra_conf.py load columns_id as list and all_columns 作为dict [str,str]

I got a below code:

# settings.yaml

my_class:
  columns_id: ${oc.env:MY_LIST}
  all_columns: {"all_columns_as_str": ${oc.env:MY_LIST}}

where my variable is MY_LIST=a,b,c

then I got:

# hydra_conf.py

from dataclasses import dataclass

@dataclass
class MyClass:
  columns_id: list
  all_columns: dict[str, str]

and then I use it all like below:

# main.py
import hydra
from hydra_conf import MyClass

@hydra.main(config_path="settings", config_name="settings")
def main(cfg: MyClass) -> None:
    assert isinstance(cfg.columns_id, list)
    assert isinstance(cfg.all_columns, dict)
    assert cfg.all_columns['all_columns_as_str'] == 'a,b,c'

How I need to configure my yml.file or my hydra_conf.py file to load columns_id as list and all_columns as a dict[str, str]?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

红颜悴 2025-02-05 05:51:29

尝试一下:

# settings.yaml
defaults:
  - my_class_schema
  - _self_

columns_id: ${oc.decode:"[${oc.env:MY_LIST}]"}
all_columns:
  all_columns_as_str: ${oc.env:MY_LIST}
# hydra_conf.py
from dataclasses import dataclass
from typing import Any
from hydra.core.config_store import ConfigStoreWithProvider

@dataclass
class MyClass:
    columns_id: list[Any]
    all_columns: dict[str, str]

cs = ConfigStoreWithProvider(__file__)
cs.store("my_class_schema", MyClass)
# main.py
import hydra
from omegaconf import DictConfig, OmegaConf
from hydra_conf import MyClass

@hydra.main(config_path=".", config_name="settings", version_base=None)
def main(cfg_: DictConfig) -> None:
    cfg: MyClass = OmegaConf.to_object(cfg_)
    assert isinstance(cfg, MyClass)
    assert isinstance(cfg.columns_id, list), f"{cfg.columns_id}"
    assert isinstance(cfg.all_columns, dict), f"{cfg.all_columns}"
    assert cfg.all_columns["all_columns_as_str"] == "a,b,c"

if __name__ == "__main__":
    main()

以下是这样做的方法:

  • 在默认列表中包括my_class_schema,这意味着您的yaml文件将与myClass定义的架构合并。请参阅结构化configs “ https://hydra.cc/docs/tutorials/structured_config/schema/” rel =“ nofollow noreferrer”>结构化配置模式)有关此的更多信息。
  • 字符串“ [$ {oc.env:my_list}]”在解决插值后,在中导致“ [a,b,c]”
  • oc.decode oc.decode resolver resolver解析字符串“ [a,b,c]”,导致[“ a”,“ b”,“ c”]

Give this a try:

# settings.yaml
defaults:
  - my_class_schema
  - _self_

columns_id: ${oc.decode:"[${oc.env:MY_LIST}]"}
all_columns:
  all_columns_as_str: ${oc.env:MY_LIST}
# hydra_conf.py
from dataclasses import dataclass
from typing import Any
from hydra.core.config_store import ConfigStoreWithProvider

@dataclass
class MyClass:
    columns_id: list[Any]
    all_columns: dict[str, str]

cs = ConfigStoreWithProvider(__file__)
cs.store("my_class_schema", MyClass)
# main.py
import hydra
from omegaconf import DictConfig, OmegaConf
from hydra_conf import MyClass

@hydra.main(config_path=".", config_name="settings", version_base=None)
def main(cfg_: DictConfig) -> None:
    cfg: MyClass = OmegaConf.to_object(cfg_)
    assert isinstance(cfg, MyClass)
    assert isinstance(cfg.columns_id, list), f"{cfg.columns_id}"
    assert isinstance(cfg.all_columns, dict), f"{cfg.all_columns}"
    assert cfg.all_columns["all_columns_as_str"] == "a,b,c"

if __name__ == "__main__":
    main()

Here's how this works:

  • Including my_class_schema in the defaults list means that your yaml file will be merged with the schema defined by MyClass. See the Hydra docs on Structured Configs (and specifically on using a Structured Config Schema) for more info about this.
  • The string "[${oc.env:MY_LIST}]" results in "[a,b,c]" after the interpolation is resolved.
  • The oc.decode resolver parses the string "[a,b,c]", resulting in ["a", "b", "c"].
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文