Python Yaml检查配置文件
我正在使用yaml存储配置数据。一旦我加载文件。我想检查是否存在某些键和值 yaml内容:Python Yaml检查配置文件,python,list,loops,yaml,Python,List,Loops,Yaml,我正在使用yaml存储配置数据。一旦我加载文件。我想检查是否存在某些键和值 yaml内容: sftp: host: server username: user password: pass path: /mnt/Storage/Folder/ filename: blah 所以我需要知道这些键值是否存在于yaml文件中。因为这些是正常工作所必需的。最好的方法是什么?我可以使用下面的方法,但我必须手动检查一个。所需的键值将增长,这只是最小值 if (key in data):
sftp:
host: server
username: user
password: pass
path: /mnt/Storage/Folder/
filename: blah
所以我需要知道这些键值是否存在于yaml文件中。因为这些是正常工作所必需的。最好的方法是什么?我可以使用下面的方法,但我必须手动检查一个。所需的键值将增长,这只是最小值
if (key in data):
return True
因此,为了确保您需要的每个密钥都存在,您必须以某种方式显式地检查每个密钥。但是,如果键是唯一的,则可以使用集合使其更干净,例如
needed = set(["host", "username", "password"]) #etc.
然后要在YAML文件中检测/读取:
seen = set()
for key, value in data.iteritems():
seen.add(key)
return needed.issubset(seen)
有两种方法。因为您的输入比(比如)带有两个键的dict更复杂,所以我选择第四个,一个路径表达式库,比如jsonpath
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
赞成/反对:非常具有描述性,尽管不如2或4中的路径好。最大的缺点:没有简单的方式来描述,期望失败了,因为lambdas打印不好您是在检查kev、值对还是只检查键或值?尝试只检查键。但是yaml文件是多级的。我不明白为什么你不能将它扩展到多个级别和/或展平嵌套列表并使用这种方法。