Programing

Python __str_ 대 __unicode___

c10106 2022. 4. 9. 09:37
반응형

Python __str_ 대 __unicode___

언제 구현해야 하는지에 대한 Python 규약이 있는가?__str__()__unicode__()수업은 무시하는 걸 봤어__unicode__()보다 자주__str__()일관성이 없는 것 같아둘 중 하나를 실행하는 것이 좋을 때 특정한 규칙이 있는가?둘 다 시행하는 것이 필요한가/좋은 실천요강인가?

__str__()오래된 방법이야. 바이트를 돌려주지. __unicode__()새롭고 선호하는 방법이야. 문자를 돌려주는 방법이지.이름이 좀 헷갈리지만, 2.x에서는 호환성을 이유로 이름이 붙지 않는다.일반적으로 문자열 형식은 모두 다음 위치에 입력하십시오.__unicode__(), 그리고 스텁을 만든다.__str__()방법:

def __str__(self):
    return unicode(self).encode('utf-8')

3.0년.str문자를 포함하므로 동일한 메서드의 이름이 지정됨__bytes__()그리고__str__()이것들은 예상대로 행동한다.

특정 클래스에 대한 마이크로 최적화 문자열화에 특히 신경을 쓰지 않았다면 항상 구현했을 것이다.__unicode__더 일반적이기 때문에 말이야다음과 같은 미세한 성능 문제(규칙이 아닌 예외)에 대해 신경 쓸 때__str__(내가 증명할 수 있을 때 비 ASC는 절대 없을 것이다.문자열 출력) 또는 둘 다(둘 다 가능할 경우)의 II 문자가 도움이 될 수 있다.

이러한 것들은 확실한 원리라고 생각하지만, 실제로는 그것을 증명하기 위한 노력 없이 ASCII 문자만 있을 것이라는 것이 매우 일반적이다(예: 문자열화된 형태는 숫자, 문장 부호, 그리고 어쩌면 짧은 ASCII 이름만 가지고 있을 수 있다;-). 이 경우에는 "그냥"으로 바로 넘어가는 것이 상당히 일반적이다.__str__" 접근 방법(그러나 나와 함께 일했던 프로그래밍 팀이 그것을 피하기 위해 현지 가이드라인을 제안한다면, 나는 제안서에 +1이 될 것이다. 이러한 문제들에서 실수하기 쉽고 "프로그래밍에서 모든 악의 근원";-)

세상이 작아지면서 마주치는 문자열은 결국 유니코드를 포함할 가능성이 있다.따라서 새로운 앱의 경우 최소한__unicode__(). 재정의할지 여부__str__()그냥 취향의 문제일 뿐이야

만약 당신이 장고에서 python2와 python3에서 모두 일하고 있다면, 나는 python_2_unicode_호환성 장식을 추천한다.

장고는 파이썬 2와 3에서 작동하는 str()와 유니코드() 메서드를 정의하는 간단한 방법을 제공한다: 텍스트를 반환하는 str() 메서드를 정의하고 python_2_unicode_compatible() 장식기를 적용해야 한다.

앞서 다른 답변에 대한 논평에서 언급된 바와 같이, 미래.utils의 일부 버전도 이 장식가를 지원한다.내 시스템에서는 python2용 최신 미래 모듈을 설치하고 python3용 미래를 설치해야 했다.그 후 다음과 같은 기능적 예를 들 수 있다.

#! /usr/bin/env python

from future.utils import python_2_unicode_compatible
from sys import version_info

@python_2_unicode_compatible
class SomeClass():
    def __str__(self):
        return "Called __str__"


if __name__ == "__main__":
    some_inst = SomeClass()
    print(some_inst)
    if (version_info > (3,0)):
        print("Python 3 does not support unicode()")
    else:
        print(unicode(some_inst))

다음은 출력 예제(여기서 venv2/venv3은 가상 환경 인스턴스):

~/tmp$ ./venv3/bin/python3 demo_python_2_unicode_compatible.py 
Called __str__
Python 3 does not support unicode()

~/tmp$ ./venv2/bin/python2 demo_python_2_unicode_compatible.py 
Called __str__
Called __str__

Python 2: _str_()만 구현하고 유니코드를 반환하십시오.

언제__unicode__()누락되어 누군가 전화를 걸다.unicode(o)또는u"%s"%o , Python 호출o.__str__()시스템 인코딩을 사용하여 유니코드로 변환한다(의 문서 참조).

그 반대는 사실이 아니다.구현하는 경우__unicode__()그러나 그렇지 않다__str__(), 그리고 누군가 전화할 때str(o)또는"%s"%o , Pythone 이 돌아니다.repr(o).


이론적 근거

A를 반환하는 것이 왜 효과가 있을 것인가?unicode로부터__str__()?
만약__str__()유니코드를 반환하고, 파이썬은 자동으로 유니코드를str시스템 인코딩 사용.

무슨 이득이 있어?
① 시스템 인코딩(즉, 시스템 인코딩)이 무엇인지에 대한 걱정으로부터 해방된다.locale.getpreferredencoeding(…)만 아니라,할 이라고 생각한다. 그런 지저분할 뿐만 아니라, 개인적으로도, 어쨌든 시스템이 신경써야 할 일이라고 생각한다.② 조심하면 Python 3과 교차 호환되는 코드가 나올 수 있다.__str__()유니코드를 반환한다.

라는 함수에서 유니코드를 반환하는 것은 기만적이지 않은가?__str__()?
. 도 있어하지만, 여러분은 이미 그것을 하고 있을지도 모른다.있다면from __future__ import unicode_literals파일 맨 위에 유니코드를 알지도 못하면서 돌려줄 가능성이 커

파이톤 3는 어때?
은 Python 3은 하지 .__unicode__()그러나, 만약 당신이 실행한다면__str__()파이톤 2나 파이톤 3으로 유니코드를 반환하면 코드의 그 부분이 교차 호환이 된다.

만약 내가 원한다면?unicode(o)와로 으로 다르다str()?
다 시행한다.__str__()(반환)str) 및__unicode__(). 나는 이것이 드물 것이라고 생각하지만, 당신은 실질적으로 다른 출력을 원할 수 있다(예: 특별한 문자의 ASCII 버전, 예를 들어, 다음과 같은 특수 문자의":)"을 위해u"☺").

나는 몇몇이 이것을 논쟁의 여지가 있다는 것을 알고 있다.

생소한 사람들에게도 지적해 볼 만하다.__unicode__ 2. 몇 파이썬 2.x와 했을 때, 동아닷컴의 기고하, 나팔의 기고하, 나팔의 기고(氣기下)와 함께 기능한다__str__.

class A :
    def __init__(self) :
        self.x = 123
        self.y = 23.3

    #def __str__(self) :
    #    return "STR      {}      {}".format( self.x , self.y)
    def __unicode__(self) :
        return u"UNICODE  {}      {}".format( self.x , self.y)

a1 = A()
a2 = A()

print( "__repr__ checks")
print( a1 )
print( a2 )

print( "\n__str__ vs __unicode__ checks")
print( str( a1 ))
print( unicode(a1))
print( "{}".format( a1 ))
print( u"{}".format( a1 ))

다음 콘솔 출력...

__repr__ checks
<__main__.A instance at 0x103f063f8>
<__main__.A instance at 0x103f06440>

__str__ vs __unicode__ checks
<__main__.A instance at 0x103f063f8>
UNICODE 123      23.3
<__main__.A instance at 0x103f063f8>
UNICODE 123      23.3

이제 내가 이 문제를 풀면__str__방법

__repr__ checks
STR      123      23.3
STR      123      23.3

__str__ vs __unicode__ checks
STR      123      23.3
UNICODE  123      23.3
STR      123      23.3
UNICODE  123      23.3

참조URL: https://stackoverflow.com/questions/1307014/python-str-versus-unicode

반응형