我使用ruamel的方式如下:
from ruamel.yaml import YAML
yaml = YAML()
print yaml.load('!!python/unicode aa')
想要的输出:
^{pr2}$实际产量:
<ruamel.yaml.comments.TaggedScalar at 0x106557150>
我知道有一种黑客攻击可以与SafeLoader一起使用,使我产生这种行为:
SafeLoader.add_constructor('tag:yaml.org,2002:python/unicode', lambda _, node: node.value)
这将返回节点的值,这是我想要的。然而,这种黑客似乎不能与RoundTripLoader一起工作。在
ipython
对打印类的处理似乎有点可笑。因为它没有考虑类TaggedScalar
上的__str__
方法。在RoundTripConstructor
(在执行往返加载时使用)基于SafeConstructor
,因此没有定义{Constructor
定义的)。因此,您可以返回到RoundConstructor
的construct_undefined
方法,该方法创建了这个{这个
TaggedScalar
有一个__str__
方法,在普通的CPython中,该方法返回实际的字符串值(存储在value
属性中)。IPython似乎没有调用这个方法。 如果更改__str__
方法的名称,那么在CPython中会得到与IPython中相同的错误结果。在假设IPython在
print
-ing时确实使用了__repr__
方法,那么就可以欺骗IPython了:这给了
^{pr2}$在我基于Linux的CPython上,当},但IPython似乎没有这样做)。在
__str__
方法被停用时(即__str__
应该由print
使用,而不是{第一个“u”表示字符串是由“utf-8”编码的,因此如果您将“u”aa“”传递到函数中,它只会将字符串“aa”传入。所以你可以传递s“u'aa”来得到输出u'aa'。在
相关问题 更多 >
编程相关推荐