Python Yaml检查配置文件

时间:2014-07-01 00:32:34

标签: python list loops yaml

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

yaml内容:

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

filename: blah

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

if (key in data):
    return True

2 个答案:

答案 0 :(得分:1)

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

  1. 完全手动

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

    Pro / con:最大控制,也是错误消息,但描述性最小。

  2. 手动路径评估

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

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

    Pro / con:可以是描述性的,但对于所有极端情况的评估都可能是非常重要的。

  3. 内置评估

    定义一组必须求值为非None值的函数。 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中的路径那么好。最大的骗局:没有简单的方式来描述,哪种期望失败,因为lambda不能很好地打印出来。

  4. 路径表达式库

    使用库来表达路径表达式,例如jsonpath。当它没有评估你想要的时候,迭代每个表达式并引发异常。

    Pro / con:易读,并且支持良好的错误消息。

  5. 用于对象树检查的库

    也许其他一些海报知道现有的,成熟的工作。我自己被这个问题困扰已经开始摆弄parseobj,但不能推荐它用于实际用途。

答案 1 :(得分:0)

因此,为了确保您需要的每个密钥都存在,您将不得不以某种方式明确地检查每个密钥。但是,如果密钥是唯一的,那么您可以使用集合使其更清晰,例如,

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

然后检测/读取YAML文件:

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

return needed.issubset(seen)