我正在使用yaml来存储我的配置数据。一旦我加载文件。我想检查某些键和值是否存在。
yaml内容:
sftp:
host: server
username: user
password: pass
path: /mnt/Storage/Folder/
filename: blah
所以我需要知道yaml文件中是否存在这些键值。因为这些是正常工作所必需的。做这个的最好方式是什么?我可以使用下面的方法,我将不得不手动检查一个。所需的键值将会增长,这只是最小值。
if (key in data):
return True
答案 0 :(得分:1)
有几种方法。由于你的输入比带有两个键的dict更复杂,我会选择第四个,一个用于路径表达式的库,比如jsonpath。
完全手动
您通过对象树导航,如果出现意外情况,则引发异常。
Pro / con:最大控制,也是错误消息,但描述性最小。
手动路径评估
您定义了预期的“路径”,然后有一个(可能是嵌套的)循环来遍历每个路径,并评估输入对象是否与路径匹配。 Philips answer属于该类别。
关于xpath for dicts这样的问题可能会为您指明一个有利的方向,即实施方式。
Pro / con:可以是描述性的,但对于所有极端情况的评估都可能是非常重要的。
内置评估
定义一组必须求值为非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不能很好地打印出来。
路径表达式库
使用库来表达路径表达式,例如jsonpath。当它没有评估你想要的时候,迭代每个表达式并引发异常。
Pro / con:易读,并且支持良好的错误消息。
用于对象树检查的库
也许其他一些海报知道现有的,成熟的工作。我自己被这个问题困扰已经开始摆弄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)