【问题标题】:Parsing Yaml in Python: Detect duplicated keys在 Python 中解析 Yaml:检测重复的键
【发布时间】:2016-02-03 02:50:45
【问题描述】:

python 中的yaml 库无法检测到重复的键。这是has been reported years ago 的错误,目前还没有修复。

我想找到一个体面的解决方法来解决这个问题。创建一个返回所有键的regex 有多合理?那么很容易检测到这个问题。

任何正则表达式大师都可以建议一个能够提取所有键以查找重复项的正则表达式吗?

文件示例:

mykey1:
    subkey1: value1
    subkey2: value2
    subkey3:
      - value 3.1
      - value 3.2
mykey2:
    subkey1: this is not duplicated
    subkey5: value5
    subkey5: duplicated!
    subkey6:
       subkey6.1: value6.1
       subkey6.2: valye6.2

【问题讨论】:

  • 他们的实现很糟糕!我同意你的看法,他们应该在构造函数中添加了选项。您是否找到了一种以编程方式验证文档的方法?

标签: python regex yaml pyyaml


【解决方案1】:

yamllint 命令行工具可以满足您的需求 想要:

sudo pip install yamllint

具体来说,它有一个规则key-duplicates 可以检测重复和键 互相重写:

$ yamllint test.yaml
test.yaml
  1:1       warning  missing document start "---"  (document-start)
  10:5      error    duplication of key "subkey5" in mapping  (key-duplicates)

(它还有许多其他规则可供您启用/禁用或调整。)

【讨论】:

    【解决方案2】:

    覆盖内置加载器是一种更轻量级的方法:

     import yaml
     # special loader with duplicate key checking
     class UniqueKeyLoader(yaml.SafeLoader):
         def construct_mapping(self, node, deep=False):
             mapping = []
             for key_node, value_node in node.value:
                 key = self.construct_object(key_node, deep=deep)
                 assert key not in mapping
                 mapping.append(key)
             return super().construct_mapping(node, deep)
    

    然后:

     yaml_text = open(filename), 'r').read()
     data[f] = yaml.load(yaml_text, Loader=UniqueKeyLoader)                  
    

    【讨论】:

    • 这是优雅而直接的,不像许多需要导入另一个包的建议。
    猜你喜欢
    • 1970-01-01
    • 2018-02-16
    • 1970-01-01
    • 2020-09-14
    • 2015-06-02
    • 1970-01-01
    • 2013-01-25
    • 2019-06-27
    • 1970-01-01
    相关资源
    最近更新 更多