2014-02-18 99 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