__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
여기 저를 괴롭히는 몇 가지 추가 문제가 있으며이를 해결하는 솔루션을 찾고 있습니다.
- 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__()
이러한 인코딩 질문과 관련하여 훌륭하게 작동하는 간단한 함수 를 작성하려면 무엇을 권장 합니까?
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))
'Development Tip' 카테고리의 다른 글
HTML5 숫자 입력 (클라이언트 측)에서 쉼표 대신 소수점을 사용합니다. (0) | 2020.11.15 |
---|---|
Pandas Dataframe에서 dtype을 개체로 사용하는 열을 문자열로 변환하는 방법 (0) | 2020.11.15 |
Windows / Linux에서 Java Swing 앱의 DPI를 설정하는 방법은 무엇입니까? (0) | 2020.11.15 |
"최상위 JSON 어레이"란 무엇이며 보안 위험이있는 이유는 무엇입니까? (0) | 2020.11.15 |
Android에서 ARM EABI v7a 시스템 이미지를 사용하는 방법은 무엇입니까? (0) | 2020.11.15 |