在 YAML 输出中抑制 !!python/unicode

Suppress !!python/unicode in YAML output

转储 (ruamel.yaml, PyYAML) 字典时 data = {'abc': 'def'} 作为 Python 2.7 中的 YAML(带有 default_flow_style=False),您将获得:

abc: def

很好。但是,如果您将所有字符串设为 unicode(通过 u 前缀或使用 from __future__ import unicode_literals),这将被转储为:

!!python/unicode 'abc': !!python/unicode 'def'

如何在不恢复使用 safe_dump() 的情况下转储所有不带标签的字符串(是否有 unicode 前缀)?添加 allow_unicode=True 并不能解决问题。

生成不需要的标签的完整示例:

from __future__ import unicode_literals

import sys
import ruamel.yaml

data = {'abc': 'def'}
ruamel.yaml.safe_dump(data, sys.stdout, allow_unicode=True, default_flow_style=False)

您需要一个不同的表示器来处理 unicodestr 的转换:

from __future__ import unicode_literals

import sys
import ruamel.yaml

def my_unicode_repr(self, data):
    return self.represent_str(data.encode('utf-8'))

ruamel.yaml.representer.Representer.add_representer(unicode, my_unicode_repr)

data = {'abc': u'def'}
ruamel.yaml.dump(data, sys.stdout, allow_unicode=True, default_flow_style=False)

给出:

abc: def

对于 PyYAML,这也适用,只需将 ruamel.yaml 替换为 yaml