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

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)

以下是一些困扰我的其他问题,我正在寻找解决它们的解决方案:

  1. 打印到UTF-8终端应该可以工作(我已经sys.stdout.encoding设置了UTF-8,但最好是其他情况也能正常工作).
  2. 将输出管道输出到文件(以UTF-8编码)应该可以工作(在这种情况下,sys.stdout.encodingNone).
  3. 我的许多__repr__()功能的代码目前有很多return ….encode('utf-8'),而且很重要.有什么强劲和轻松的吗?
  4. 在某些情况下,我甚至有丑陋的野兽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)

  • 语言参考也可能是_deliberately_模糊的,因为它不应该只是**CPython**的参考,而是_all_符合Python的实现:在Jython和IronPython中,我们非常渴望考虑完全符合要求的实现,**所有**字符串都是Unicode(并且它将是昂贵的并且完全违背它们各自的平台来制作其他东西).也许我们确实需要一个补充的**CPython**特定于实现的引用,作为一个_addition_到实现中立的**语言**. (3认同)
  • @EOL,**返回值必须是一个字符串对象.**是你指向的参考手册页如何表达约束,即返回值必须是`str`的​​实例(unicode对象不是"字符串"宾语").`repr`是_normally_只能返回ascii(所有unicode对象的`repr(uo)`的东西,例如:even _that_只返回ascii - 我认为没有内置或标准库类型表现不同)但严格来说这不是语言约束,因此它不是参考手册的业务.建议的文档补丁总是受欢迎的,顺便说一下! - ) (2认同)

Tit*_*ton 6

我认为装饰者可以__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)