سؤال

على PyYAML حزمة الأحمال علامات سلاسل إما unicode أو str الكائنات اعتمادا على محتواها.

وأود أن استخدام unicode الكائنات في جميع أنحاء البرنامج (و للأسف لا يمكن التبديل إلى بيثون 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']

هل كانت مفيدة؟

المحلول

هنا هو الإصدار الذي يتجاوز 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-بناء محلل) كما لم أستطع تجميع أنه على الرغم من ذلك سأترك إجابة أخرى كما كان.

نصائح أخرى

وهنا وظيفة يمكن استخدامها تستخدم لتحل محل str مع unicode أنواع من فك إخراج PyYAML:

def make_str_unicode(obj):
    t = type(obj)

    if t in (list, tuple):
        if t == tuple:
            # Convert to a list if a tuple to 
            # allow assigning to when copying
            is_tuple = True
            obj = list(obj)
        else: 
            # Otherwise just do a quick slice copy
            obj = obj[:]
            is_tuple = False

        # Copy each item recursively
        for x in xrange(len(obj)):
            obj[x] = make_str_unicode(obj[x])

        if is_tuple: 
            # Convert back into a tuple again
            obj = tuple(obj)

    elif t == dict: 
        for k in obj:
            if type(k) == str:
                # Make dict keys unicode
                k = unicode(k)
            obj[k] = make_str_unicode(obj[k])

    elif t == str:
        # Convert strings to unicode objects
        obj = unicode(obj)
    return obj

print make_str_unicode({'blah': ['the', 'quick', u'brown', 124]})
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top