我们使用yaml在特定情况下传递某些数据。我们想进一步推广它,我开始我们应该使用yaml.safe_load()。关于yaml没有什么特别复杂的,但是当原始字符串是unicode时,我注意到一个特殊的功能。例如:
>>> x = u"hello"
>>> x
u'hello'
>>> yaml.dump(x)
"!!python/unicode 'hello'\n"
如果我尝试阅读此内容,我会遇到异常:
...
File "f:\users\---\PyYAML-3.11-py2.7-win-amd64.egg.tmp\yaml\constructor.py", line 414, in construct_undefined yaml.constructor.ConstructorError: could not determine a constructor for the tag 'tag:yaml.org,2002:python/unicode'
in "<string>", line 1, column 1:
!!python/unicode 'hello'
我已经看到可以指示safe_load上支持类,但这不是用户类。我可以切换到使用safe_dump(),但是如果数据由一个工具的旧版本编写并且由另一个工具的较新版本读取(比如说),则无法工作。
所以问题:我可以告诉pyyaml它可以加载python unicode字符串吗?
答案 0 :(得分:1)
不知道是否有更简洁的方式,但我找到了答案......
>>> def constructor(loader, node):
... return node.value
...
>>> yaml.SafeLoader.add_constructor("tag:yaml.org,2002:python/unicode", constructor)
>>> yaml.safe_load(y)
u'hello'
>>>
我想可能值得检查node.value实际上是一个unicode值,而在实际代码中我的结构略有不同,但是这样可行。关键是使用:
yaml.SafeLoader.add_constructor()
而不是:
yaml.add_constructor()
我认为这与使用未记录的API一样,所以任何替代答案都会很有趣。