Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Yaml检查配置文件_Python_List_Loops_Yaml - Fatal编程技术网

Python 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):

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

yaml内容:

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

  • 完全手动操作

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

    赞成/反对:最大限度的控制,也对错误消息,但最小的描述性

  • 手动路径评估

    定义预期的“路径”,然后有一个(可能是嵌套的)循环遍历每个路径,并计算输入对象是否与路径匹配。属于这一类

    像这样的问题可能会为您指出一个有利的方向,从实现角度来看

    赞成/反对:可以是描述性的,但对于所有角落案例来说,要获得正确的评估结果可能并非微不足道

  • 内置评估

    您定义了一组必须计算为非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
    
    赞成/反对:非常具有描述性,尽管不如2或4中的路径好。最大的缺点:没有简单的方式来描述,期望失败了,因为lambdas打印不好

  • 路径表达式库

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

    赞成/反对:清晰易读,并且很好地支持正确的错误消息

  • 用于对象树检查的库

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


  • 您是在检查kev、值对还是只检查键或值?尝试只检查键。但是yaml文件是多级的。我不明白为什么你不能将它扩展到多个级别和/或展平嵌套列表并使用这种方法。