2014-02-18 67 views
2

YAML和元组作为字典键

d = {3: u'blah', u'b': u'foo', (12,2,3) : u'bonjour'} 

是一本字典。如果我使用

g = yaml.dump(d) 
h = yaml.load(g) 
print g, h 

这是非常好的,但我得到很多!!python/unicode无处不在,所以这不是好以提高可读性。

在另一方面,如果我使用:

g = yaml.safe_dump(d) 
h = yaml.load(g) 
print g, h 

有没有更多的!!python/unicode也没有!!python/tuple了,所以load不起作用,因为多元组没有被正确理解。

如何与YAML取得平衡?

  • 没有!!python/unicode无处不在,
  • 有元组作为字典主要的工作! (所以大概!!python/typle必须保持)
+0

我想你需要跟PyYAML开发商。 – nodakai

回答

1

如果你搜索python yaml unicode,第一个结果是this bug report,其中有正是你要寻找的解决方案。总之,注册自定义申述为Unicode字符串,像这样:在地方

yaml.add_representer(unicode, 
        lambda dumper, value: dumper.represent_scalar(u'tag:yaml.org,2002:str', value)) 

有了这个,你的榜样呈现这样的:

>>> d = {3: u'blah', u'b': u'foo', (12,2,3) : u'bonjour'} 
>>> print yaml.dump(d) 
3: blah 
? !!python/tuple [12, 2, 3] 
: bonjour 
b: foo 
+0

谢谢@larsks,这正是我一直在寻找的!顺便说一下,是否有类似的方法重新命名标签'!! python/tuple'到'tuple'? – Basj

+0

可能吗?我从来没有尝试写一个自定义构造函数。您需要花费一些时间在[代表者和构造函数]的PyYAML文档上(http://pyyaml.org/wiki/PYYAMLDocumentation#Constructorsrepresentersresolvers)。 – larsks