首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python文件在hydra中创建一个新密钥

从python文件在hydra中创建一个新密钥
EN

Stack Overflow用户
提问于 2021-02-21 02:50:07
回答 1查看 1.2K关注 0票数 4

我想在我的Hydra Config加载后添加一个key + value。本质上,我想运行我的代码并检查gpu是否可用。如果是,则将设备登录为gpu,否则保留cpu。

实质上节省了以下内容的输出:

代码语言:javascript
复制
torch.cuda.is_available()

当我尝试添加带有"setdefault“的密钥时,如下所示:

代码语言:javascript
复制
@hydra.main(config_path="conf", config_name="config")
def my_app(cfg: DictConfig) -> None:
    cfg.setdefault("new_key", "new_value")

如果我这样做了,也会出现同样的错误:

代码语言:javascript
复制
  cfg.new_key = "new_value"
  print(cfg.new_key)

我得到了错误:

代码语言:javascript
复制
omegaconf.errors.ConfigKeyError: Key 'new_key' is not in struct
        full_key: new_key
        reference_type=Optional[Dict[Union[str, Enum], Any]]
        object_type=dict

我目前的解决方法是像这样使用OmegaConfig:

代码语言:javascript
复制
  cfg = OmegaConf.structured(OmegaConf.to_yaml(cfg))
  cfg.new_key = "new_value"
  print(cfg.new_key)
  >>>> new_value

当然,肯定有更好的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-21 05:36:10

Hydra在它生成的OmegaConf配置对象的根上设置结构标志。有关结构标志的更多信息,请参见this

您可以使用open_dict()临时禁用此功能,并允许添加新密钥:

代码语言:javascript
复制
>>> from omegaconf import OmegaConf,open_dict
>>> conf = OmegaConf.create({"a": {"aa": 10, "bb": 20}})
>>> OmegaConf.set_struct(conf, True)
>>> with open_dict(conf):
...   conf.a.cc = 30
>>> conf.a.cc
30
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66295334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档