ipython
处理打印类似乎有些有趣。因为它没有考虑到__str__
class 上的方法TaggedScalar
。
(RoundTripConstructor
在进行往返加载时使用)基于SafeConstructor
并且python/unicode
未定义标签(它是为 non-safe 定义的Constructor
)。因此,您回退到创建 this的construct_undefined
方法,并将其作为正常的两步创建过程的一部分产生。RoundConstructor
TaggedScalar
这TaggedScalar
有一个__str__
方法,在普通的 CPython 中返回实际的字符串值(存储在value
属性中)。IPython 似乎没有调用该方法。如果更改__str__
方法的名称,您在 CPython 中会得到与在 IPython 中相同的错误结果。
假设 IPython 在-ing__repr__
时确实使用了该方法,您可能能够欺骗 IPython :print
from ruamel.yaml import YAML
from ruamel.yaml.comments import TaggedScalar
def my_representer(x):
try:
if isinstance(x.value, unicode):
return "u'{}'".format(x.value)
except:
pass
return x.value
TaggedScalar.__repr__ = my_representer
yaml = YAML()
print yaml.load('!!python/unicode aa')
这使
u'aa'
在我的基于 Linux 的 CPython 上,当该__str__
方法被停用时(即__str__
应该由print
支持 使用__repr__
,但 IPython 似乎没有这样做)。