最佳输出类型和编码实践

最近,我在__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.encodingNone )。
  • 我的许多__repr__()函数的代码目前有很多return ….encode('utf-8') ,这很重。 有没有什么健壮和轻量?
  • 在某些情况下,我甚至会有像return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')丑陋野兽return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8') ,的对象被解码,放入格式化字符串中,然后重新编码。 我想避免这种复杂的转变。
  • 为了编写简单的__repr__()函数,对于这些编码问题,您会推荐如何编写简单的__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吗? 它可能不会直接回答您的其他问题,但我确实发现它有助于说明为什么会发生某些错误。


    from __future__ import unicode_literals

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

    可以更简单地写成

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

    假设str在您的系统上编码为utf-8

    如果没有from __future__ import unicode_literals ,则表达式可以写为:

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

    我认为装饰者可以以一种理智的方式管理__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}'
    

    我使用如下的函数:

    def stdout_encode(u, default='UTF8'):
        if sys.stdout.encoding:
            return u.encode(sys.stdout.encoding)
        return u.encode(default)
    

    然后我的__repr__函数看起来像这样:

    def __repr__(self):
        return stdout_encode(u'<MyClass {0} {1}>'.format(self.abcd, self.efgh))
    
    链接地址: http://www.djcxy.com/p/28301.html

    上一篇: Best output type and encoding practices for

    下一篇: Python string formatting: % vs. .format