Eri*_*got 66 python encoding ascii repr
最近,我有很多的麻烦__repr__(),format()和编码. 输出__repr__()应该编码还是unicode字符串?__repr__()Python中 的结果是否有最佳编码?我想输出的内容确实有非ASCII字符.
我使用Python 2.x,并希望编写可以轻松适应Python 3的代码.程序因此使用
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function # The 'Hello' literal represents a Unicode object
Run Code Online (Sandbox Code Playgroud)
以下是一些困扰我的其他问题,我正在寻找解决它们的解决方案:
sys.stdout.encoding设置了UTF-8,但最好是其他情况也能正常工作).sys.stdout.encoding是None).__repr__()功能的代码目前有很多return ….encode('utf-8'),而且很重要.有什么强劲和轻松的吗?return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8'),即对象的表示被解码,放入格式化字符串,然后重新编码.我想避免这种错综复杂的转变.为了编写__repr__()与这些编码问题相关的简单函数,您建议做什么?
unu*_*tbu 42
在Python2中,__repr__(和__str__)必须返回一个字符串对象,而不是一个unicode对象.在Python3中,情况正好相反,__repr__而且__str__
必须返回Unicode对象,而不是字节(姓字符串)对象:
class Foo(object):
def __repr__(self):
return u'\N{WHITE SMILING FACE}'
class Bar(object):
def __repr__(self):
return u'\N{WHITE SMILING FACE}'.encode('utf8')
repr(Bar())
# ?
repr(Foo())
# UnicodeEncodeError: 'ascii' codec can't encode character u'\u263a' in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
在Python2中,你真的没有选择.您必须选择返回值的编码__repr__.
顺便问一下,你读过PrintFails wiki吗?它可能无法直接回答您的其他问题,但我确实发现它有助于说明为什么会发生某些错误.
使用时from __future__ import unicode_literals,
'<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')
Run Code Online (Sandbox Code Playgroud)
可以更简单地写成
str('<{}>').format(repr(x))
Run Code Online (Sandbox Code Playgroud)
假设您的系统str编码utf-8.
没有from __future__ import unicode_literals,表达式可以写成:
'<{}>'.format(repr(x))
Run Code Online (Sandbox Code Playgroud)
我认为装饰者可以__repr__以理智的方式管理不兼容性.这是我用的:
from __future__ import unicode_literals, print_function
import sys
def force_encoded_string_output(func):
if sys.version_info.major < 3:
def _func(*args, **kwargs):
return func(*args, **kwargs).encode(sys.stdout.encoding or 'utf-8')
return _func
else:
return func
class MyDummyClass(object):
@force_encoded_string_output
def __repr__(self):
return 'My Dummy Class! \N{WHITE SMILING FACE}'
Run Code Online (Sandbox Code Playgroud)