我正在以下列方式使用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。
答案 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
}
}
似乎那样做。)