python – __repr __()函数的最佳输出类型和编码实践?

最近,我有很多麻烦__repr __(),format()和编码。 __repr __()的输出应该被编码还是一个unicode字符串?在Python中__repr __()的结果有最好的编码吗?我想输出的内容有非ASCII字符。

我使用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 __()函数目前有很多返回… .encode(‘utf-8’),这很重。有什么强大和更轻?
>在某些情况下,我甚至有丑的野兽,如return(‘< {}>‘。format(repr(x).decode(‘utf-8’)))encode(‘utf-8’),ie ,对象的表示被解码,放入格式化字符串,然后重新编码。我想避免这种复杂的变换。

你会推荐做什么,以便编写简单的__repr __()函数,这些函数在这些编码问题上表现得很好?

在Python2中,__repr__(和__str__)必须返回一个字符串对象,而不是一个
unicode对象。在Python3中,情况相反,__repr__和__str__
必须返回unicode对象,而不是byte(née字符串)对象:

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)

在Python2中,你真的没有选择。你必须选择一个编码
__repr__的返回值。

顺便说一下,你看过PrintFails wiki吗?它可能不直接回答
你的其他问题,但我确实发现它有助于照亮为什么肯定
错误。

当使用__future__ import unicode_literals时,

'<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')

可以更简单地写成

str('<{}>').format(repr(x))

假设str编码到您的系统上的utf-8。

没有__future__ import unicode_literals,表达式可以写成:

'<{}>'.format(repr(x))
http://stackoverflow.com/questions/3627793/best-output-type-and-encoding-practices-for-repr-functions

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:python – __repr __()函数的最佳输出类型和编码实践?