最近,我在__repr__()
,format()
和编码方面遇到了很多麻烦。 __repr__()
的输出是否应该被编码或是一个unicode字符串? Python中的__repr__()
的结果是否有最好的编码?我想要输出的确有非ASCII字符。__repr __()函数的最佳输出类型和编码实践?
我使用Python 2.x和要编写能够很容易地适应到Python 3代码因此,本方案采用
# -*- coding: utf-8 -*-
from __future__ import unicode_literals, print_function # The 'Hello' literal represents a Unicode object
下面是已困扰了我一些额外的问题,而且我我想找的是解决他们的解决方案:
- 打印到UTF-8的终端应该工作(我有
sys.stdout.encoding
设置为UTF-8
,但它是最好的,如果其他情况下,工作太)。 - 管道输出到一个文件(UTF-8编码)应该工作(在这种情况下,
sys.stdout.encoding
是None
)。 - 我的代码很多
__repr__()
功能目前有很多return ….encode('utf-8')
,这很重。有没有什么健壮和轻量? - 在某些情况下,我甚至有丑陋的野兽,比如
return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')
,即对象的表示被解码,放入一个格式化字符串,然后重新编码。我想避免这种复杂的转变。
对于编写简单的__repr__()
函数,您会建议如何处理这些编码问题?
这将是很好,如果文档提到这个:)(http://docs.python.org/reference/datamodel.html#basic-customization没有)......反正......你会说问题中第4点的方法很繁琐但是必要的,对吗? – EOL 2010-09-02 14:11:54
EOL:假设Python2,'repr(x)'必须返回一个编码字符串。如果它使用utf-8编码,那么'repr(x).decode('utf8')。encode('utf8')'不应该是必需的。 如果'repr(x)'使用其他编码进行编码,'repr(x).decode('utf8')'将会失败(使用UnicodeDecodeError)或产生伪造结果,或者可能是幸运偶然正确解码。因此,AFAIK,'repr(x).decode('utf8')。encode('utf8')' 应该永远不需要。你能提供一个例子吗? – unutbu 2010-09-02 14:23:09
@EOL,**返回值必须是一个字符串对象**是您指向的参考手册页如何表达返回值必须是“str”实例的约束条件(unicode对象不会是“a字符串对象“)。 'repr'通常只会返回ascii(所有unicode对象的'repr(uo)'的东西,例如:甚至_that_只返回ascii - 我认为没有内置或标准库类型的行为),但严格来说这不是语言限制,所以它不是参考手册的业务。建议的文档补丁总是欢迎,顺便说一句! - ) – 2010-09-02 14:29:01