【问题标题】:Python Yaml check config filePython Yaml 检查配置文件
【发布时间】:2014-07-01 00:32:33
【问题描述】:

我正在使用 yaml 来存储我的配置数据。一旦我加载文件。我想检查某些键和值是否存在。

yaml 内容:

sftp:
 host: server
 username: user
 password: pass
 path: /mnt/Storage/Folder/

filename: blah

所以我需要知道这些键值是否存在于 yaml 文件中。因为这些是正常工作所必需的。做这个的最好方式是什么?我可以在下面使用这种方法,我必须手动检查一个。所需的键值会增加,这只是最小值。

if (key in data):
    return True

【问题讨论】:

  • 您是在检查 kev、值对还是仅检查键或仅检查值?
  • 试图只检查密钥。

标签: python list loops yaml


【解决方案1】:

有几种方法。由于您的输入比具有两个键的 dict 更复杂,所以我会选择第四个,一个用于路径表达式的库,例如 jsonpath。

  1. 完全手动

    您在对象树中导航,如果出现意外情况则引发异常。

    Pro/con:最大程度的控制,也包括错误信息,但最少的描述性。

  2. 手动路径评估

    您定义了预期的“路径”,然后有一个(可能是嵌套的)循环遍历每个路径,并评估输入对象是否与路径匹配。 Philips answer 属于该类别。

    像这样一个关于xpath for dicts 的问题可能会为您指明一个有利的方向,实现方面。

    赞成/反对:可以是描述性的,但对于所有极端情况进行正确评估可能并非易事。

  3. 内置评估

    您定义了一组必须评估为非无值的函数。 Python 为您进行评估。大致如下:

    must_evaluate = {
        lambda o: o["sftp"]["host"],
        lambda o: o["sftp"]["username"],
        lambda o: o["sftp"]["passowrd"],
        lambda o: o["sftp"]["path"],
        lambda o: o["filename"],
    }
    
    
    def check_with_builtin_resolution(obj):
        def check_lambda_on_obj(l):
            try:
                if l(obj) is not None:
                    return True
            except AttributeError:
                pass
            except KeyError:
                pass
            return False
    
        for l in must_evaluate:
            if not check_lambda_on_obj(l):
                return False
        return True
    

    Pro/con:描述性很强,虽然不如 2 或 4 中的路径好。最大的缺点:没有简单的方式来描述,期望失败,因为 lambdas 不能很好地打印。

  4. 路径表达式库

    为路径表达式使用库,例如​​ jsonpath。迭代每个表达式并引发异常,当它的计算结果不符合您的要求时。

    Pro/con:清晰易读,并且很好地支持体面的错误消息。

  5. 对象树检查库

    也许其他一些发帖人知道现有的成熟作品。我自己被这个问题困扰已经开始摆弄parseobj,但目前还不能推荐它用于实际使用。

【讨论】:

    【解决方案2】:

    因此,为了确保您需要的每个密钥都存在,您必须以某种方式明确检查每个密钥。但是,如果键是唯一的,那么您可以使用集合使其更简洁,例如,

    needed = set(["host", "username", "password"]) #etc.
    

    然后在 YAML 文件中检测/读取:

    seen = set()
    for key, value in data.iteritems():
        seen.add(key)
    
    return needed.issubset(seen)
    

    【讨论】:

    • 但是yaml文件是多级的。这行不通。
    • 我不明白为什么您不能将其扩展到多个级别和/或展平嵌套列表并使用这种方法。
    猜你喜欢
    • 1970-01-01
    • 2016-02-05
    • 2020-05-07
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2012-11-19
    相关资源
    最近更新 更多