كيفية فرض PyYAML تحميل سلاسل unicode الكائنات ؟
-
04-10-2019 - |
سؤال
على 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]})