Как заставить PyYAML загружать строки как объекты Unicode?

Пакет PyYAML загружает немаркированные строки как объекты Unicode или Str, в зависимости от их содержимого.

Я хотел бы использовать объекты Unicode во всей моей программе (и, к сожалению, пока не могу переключиться на Python 3).

Есть ли простой способ заставить PyYAML всегда загружать Unicode-объекты? Я не хочу загромождать мой YAML!!python/unicode теги.

# Encoding: UTF-8

import yaml

menu= u"""---
- spam
- eggs
- bacon
- crème brûlée
- spam
"""

print yaml.load(menu)

Выход:['spam', 'eggs', 'bacon', u'cr\xe8me br\xfbl\xe9e', 'spam']

Мне бы хотелось:[u'spam', u'eggs', u'bacon', u'cr\xe8me br\xfbl\xe9e', u'spam']

Ответы на вопрос(1)

Решение Вопроса

которая переопределяет обработку строк PyYAML, всегда выводяunicode, В действительности это, вероятно, тот же результат, что и в другом ответе, который я опубликовал, за исключением более короткого (т. Е. Вам все равно нужно убедиться, что строки в пользовательских классах преобразованы вunicode или прошлоunicode самостоятельно, если вы используете пользовательские обработчики):

# -*- coding: utf-8 -*-
import yaml
from yaml import Loader, SafeLoader

def construct_yaml_str(self, node):
    # Override the default string handling function 
    # to always return unicode objects
    return self.construct_scalar(node)
Loader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)
SafeLoader.add_constructor(u'tag:yaml.org,2002:str', construct_yaml_str)

print yaml.load(u"""---
- spam
- eggs
- bacon
- crème brûlée
- spam
""")

(Выше дает[u'spam', u'eggs', u'bacon', u'cr\xe8me br\xfbl\xe9e', u'spam'])

Я не проверял это наLibYAML (синтаксический анализатор на основе c), поскольку я не смог его скомпилировать, поэтому оставлю другой ответ таким, какой он был.

 Petr Viktorin04 июн. 2010 г., 13:26
Это прекрасно, спасибо! Он работает со строками внутри пользовательских классов и с CLoader LibYAML. И выглядит намного чище :) Еще раз спасибо!
 Hubro02 окт. 2012 г., 14:48
Прошло более двух лет с тех пор, как этот ответ был принят, и pyYAML все еще возвращаетсяstr объекты. Возможно, к настоящему моменту существует более простой способ форсировать вывод всех юникодов? Я хотел бы обновленный ответ.
 zxq910 мар. 2014 г., 15:20
Что делает YAML раздражающим для всей половины Pythonia, которая использует wxPython для приложений с графическим интерфейсом. Гораздо менее раздражающий, чем сатирические форматы данных, такие как XML, но все же довольно раздражающий.
 Petr Viktorin15 дек. 2013 г., 12:47
Я так не думаю, и я думаю, что вряд ли это будет добавлено. Это работает нормально в Python 3, хотя.

Ваш ответ на вопрос