0

我通过以下方式使用ruamel:

from ruamel.yaml import YAML
yaml = YAML()
print yaml.load('!!python/unicode aa')

想要的输出:

u'aa'

实际输出:

<ruamel.yaml.comments.TaggedScalar at 0x106557150>

我知道可以与 SafeLoader 一起使用的 hack 给我这种行为:

SafeLoader.add_constructor('tag:yaml.org,2002:python/unicode', lambda _, node: node.value)

这将返回节点的值,这就是我想要的。但是,此 hack 似乎不适用于 RoundTripLoader。

4

2 回答 2

0

第一个'u'表示字符串是'utf-8'编码的,所以如果你将'u'aa''传递给函数,它只会输入'aa'字符串。所以你可以通过 s"u'aa'" 得到输出 u'aa'。

于 2017-12-26T10:09:10.937 回答
0

ipython处理打印类似乎有些有趣。因为它没有考虑到__str__class 上的方法TaggedScalar

RoundTripConstructor在进行往返加载时使用)基于SafeConstructor并且python/unicode未定义标签(它是为 non-safe 定义的Constructor)。因此,您回退到创建 this的construct_undefined方法,并将其作为正常的两步创建过程的一部分产生。RoundConstructorTaggedScalar

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 似乎没有这样做)。

于 2017-12-27T16:02:30.893 回答