【问题标题】:pyyaml safe_load: how to ignore local tagspyyaml safe_load:如何忽略本地标签
【发布时间】:2016-01-08 00:12:42
【问题描述】:

我正在使用yaml.safe_load(),但我需要忽略标签!v2——有没有办法做到这一点但仍然使用safe_load()

【问题讨论】:

    标签: python yaml pyyaml


    【解决方案1】:

    我想通了,和How can I add a python tuple to a YAML file using pyYAML?有关

    我只需要这样做:

    • 子类yaml.SafeLoader
    • 调用add_constructor!v2 分配给自定义构造方法
    • 在自定义构造方法中,做任何适当的事情
    • 使用yaml.load(..., MyLoaderClass) 而不是yaml.safe_load(...)

    它有效。

    class V2Loader(yaml.SafeLoader):
        def let_v2_through(self, node):
            return self.construct_mapping(node)
    V2Loader.add_constructor(
        u'!v2',
        V2Loader.let_v2_through)
    
       ....
    
    y = yaml.load(info, Loader=V2Loader)
    

    【讨论】:

    【解决方案2】:

    扩展现有答案以支持忽略所有未知标签。

    import yaml
    
    class SafeLoaderIgnoreUnknown(yaml.SafeLoader):
        def ignore_unknown(self, node):
            return None 
    
    SafeLoaderIgnoreUnknown.add_constructor(None, SafeLoaderIgnoreUnknown.ignore_unknown)
    
    root = yaml.load(content, Loader=SafeLoaderIgnoreUnknown)
    

    【讨论】:

      【解决方案3】:

      this solution 的问题在于它只适用于v2 标签,并且只有当它所在的 yaml 对象是映射类型对象时。

      This solution 将适用于所有标签,但问题是数据将被完全忽略。你只会得到一个null 的数据。

      如果您想忽略对所有标签的任何特殊处理,但仍然得到解析的值,就好像标签不存在一样,以下应该有效:

      def unknown(loader, suffix, node):
          if isinstance(node, yaml.ScalarNode):
              constructor = loader.__class__.construct_scalar
          elif isinstance(node, yaml.SequenceNode):
              constructor = loader.__class__.construct_sequence
          elif isinstance(node, yaml.MappingNode):
              constructor = loader.__class__.construct_mapping
      
          data = constructor(loader, node)
      
          return data
      
      yaml.add_multi_constructor('!', unknown)
      yaml.add_multi_constructor('tag:', unknown)
      
      return yaml.load_all(infile, Loader=yaml.FullLoader)
      
      

      请注意,如果您想使用不同的加载器,例如 SafeLoader,您需要在调用加载函数之前将该加载器显式提供给 add_multi_constructor():

      yaml.add_multi_constructor('!', unknown, Loader=yaml.SafeLoader)
      
      ...
      
      return yaml.load_all(infile, Loader=yaml.SafeLoader)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2017-08-08
        • 2018-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多