Development Tip

__repr __ () 함수에 대한 최상의 출력 유형 및 인코딩 방법?

yourdevel 2020. 11. 15. 11:51
반응형

__repr __ () 함수에 대한 최상의 출력 유형 및 인코딩 방법?


최근에, 나는에 문제가 많이 했어 __repr__(), format()및 인코딩을. 의 출력 __repr__()이 인코딩 되어야합니까 아니면 유니 코드 문자열이어야합니까? __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

여기 저를 괴롭히는 몇 가지 추가 문제가 있으며이를 해결하는 솔루션을 찾고 있습니다.

  1. UTF-8 터미널로 인쇄하면 작동합니다 (로 sys.stdout.encoding설정 UTF-8했지만 다른 경우에도 작동하는 것이 가장 좋습니다).
  2. 출력을 파일 (UTF-8로 인코딩 됨)로 파이핑하면 작동합니다 (이 경우는 sys.stdout.encoding입니다 None).
  3. 많은 __repr__()함수에 대한 내 코드 에는 현재 많은 return ….encode('utf-8'). 견고하고 가벼운 것이 있습니까?
  4. 어떤 경우에는 return ('<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')객체의 표현을 디코딩하고 형식화 문자열에 넣은 다음 다시 인코딩하는 것과 같은 추악한 짐승도 있습니다 . 나는 그러한 복잡한 변형을 피하고 싶습니다.

__repr__()이러한 인코딩 질문과 관련하여 훌륭하게 작동하는 간단한 함수 를 작성하려면 무엇을 권장 합니까?


Python2에서 __repr__(및 __str__)은 유니 코드 객체가 아닌 문자열 객체를 반환해야합니다. Python3에서, 상황은 반전, __repr__그리고 __str__객체 유니 코드 객체가 아닌 바이트 (노나 문자열)을 반환해야합니다 :

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 위키 를 읽었 습니까? 다른 질문에 직접 답하지 않을 수도 있지만 특정 오류가 발생하는 이유를 설명하는 데 도움이되는 것으로 나타났습니다.


를 사용할 때 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))

참고 URL : https://stackoverflow.com/questions/3627793/best-output-type-and-encoding-practices-for-repr-functions

반응형