pyyaml safe_load:如何忽略本地标签
Posted
技术标签:
【中文标题】pyyaml safe_load:如何忽略本地标签【英文标题】:pyyaml safe_load: how to ignore local tags 【发布时间】:2016-01-08 00:12:42 【问题描述】:我正在使用yaml.safe_load()
,但我需要忽略标签!v2
——有没有办法做到这一点但仍然使用safe_load()
?
【问题讨论】:
【参考方案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)
【讨论】:
如果您只想跳过/忽略任何标签,另请参阅***.com/a/13281292/165629。【参考方案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)
【讨论】:
以上是关于pyyaml safe_load:如何忽略本地标签的主要内容,如果未能解决你的问题,请参考以下文章