如何在python中使用ruamel

时间:2017-12-26 09:58:30

标签: python ruamel.yaml

我正在以下列方式使用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。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

ipython处理打印课程似乎有些有趣。因为它没有考虑课程__str__上的TaggedScalar方法。

RoundTripConstructor(在进行往返加载时使用)基于SafeConstructor,并且python/unicode标记未定义(它是针对非Constructor定义的安全construct_undefined)。因此,您回退到创建此RoundConstructor的{​​{1}}的{​​{1}}方法,并将其作为正常两步创建过程的一部分。

这个TaggedScalar有一个TaggedScalar方法,在普通的CPython中返回实际的字符串值(存储在__str__属性中)。 IPython似乎没有调用该方法。 如果更改value方法的名称,则会在CPython中获得与IPython相同的错误结果。

你可能能够欺骗IPython,假设它在__str__时使用__repr__方法:

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不支持// iterate over DataGridView rows foreach (DataGridViewRow row in actGrid.Rows) { // check, if row is selected by checkbox if (Equals(row.Cells["select"].Value, true)) { // get values for selected row var mc_no_Value = (string)row.Cells["mc_no"].Value; var member_Value = (string)row.Cells["member"].Value; // do smth with values here } } 似乎那样做。)