【问题标题】:Input YAML config values into keyword arguments for Python将 YAML 配置值输入到 Python 的关键字参数中
【发布时间】:2022-04-15 23:46:07
【问题描述】:

我想要一个 YAML 配置文件,用于我的 Python 脚本的某些分析设置。 YAML 文件如下所示:

settings:
  param1: 1
  param2: two
  ...

在我的 Python 脚本中,我想将这些值作为关键字参数传递给函数。加载 YAML 文件给了我一本字典。该函数只有关键字参数,我事先不知道配置文件将具有哪些关键字参数。该函数看起来像这样:

def process(param1=None, param2=None, param3=None):
    ...

请注意,YAML 设置的名称与关键字参数名称相同。该函数有几个可能的关键字参数,而配置文件可能只有一两个。显然,我想将值分配给正确的关键字参数。

如何将 YAML 值(和/或字典)分配给它们的关键字参数分配?

【问题讨论】:

  • 为什么投反对票?这个问题有什么不足?

标签: python python-3.x pyyaml


【解决方案1】:

您可以从yaml.load() 获取字典并使用** 语法将键/值传递给函数。这样您就不必事先知道密钥。例如:

import yaml

with open('path/to/config.yml', 'rb') as f:
    conf = yaml.safe_load(f.read())    # load the config file

def process(**params):    # pass in variable numbers of args
    for key, value in params.items():
        print('%s: %s' % (key, value))

process(**conf)    # pass in your keyword args

用你的代码试试这个,它应该让你对如何实现你自己的代码有足够的了解。

【讨论】:

  • 请注意:您应该使用 yaml.safe_load 而不是 yaml.load
  • 仅位置参数怎么样?
【解决方案2】:

所以,我遇到了你的问题,我认为这可能会有所帮助。 PyYAML 太棒了!它支持的一件事是直接从 python 进行类映射

import yaml
class Hero:
    def __init__(self, name, hp, sp):
        self.name = name
        self.hp = hp
        self.sp = sp
    def __repr__(self):
        return "Hero %s has %d Hitpoints" % (self.name, self.hp)


f = "sample.yml"
with open(f, mode='w') as ff:
    ff.write(yaml.dump(Hero(name="Cool Guy", hp=4, sp=10)))

    # saves as !!python/object:__main__.Hero {hp: 4, name: Cool Guy, sp: 10}

    ff.close()
with open(f, mode="r") as fx:
    y = yaml.load(fx)
    print(y)

[out]: Hero Cool Guy has 4 Hitpoints

希望您能像我一样发现它的用途。查看PyYAML Docs 了解更多信息。

【讨论】:

    【解决方案3】:

    您可以在 python 中迭代字典中的键:

    for key in data:
        print(key)
    

    这将允许您通过调用获取密钥并在您的函数中使用它:

    data[key] # returns value from dict
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多