2013-05-07 1 views
5

파이썬 버전 2.7.3을 사용하고 있습니다.파이썬의 문자열과 유니 코드 강제/마법 함수는 어떻게 작동합니까?

파이썬에서, 우리는 우리의 사용자 정의 클래스에 strunicode의 동작을 정의하는 마법의 방법 __str____unicode__를 사용

동작은 __str____unicode__의 반환 값이 강제 변환되는 것을 알 수
>>> class A(object): 
    def __str__(self): 
    print 'Casting A to str' 
    return u'String' 
    def __unicode__(self): 
    print 'Casting A to unicode' 
    return 'Unicode' 


>>> a = A() 
>>> str(a) 
Casting A to str 
'String' 
>>> unicode(a) 
Casting A to unicode 
u'Unicode' 

str 또는 unicode에 따라 다릅니다.

그러나, 우리가 할 경우이 :

>>> class B(object): 
    def __str__(self): 
    print 'Casting B to str' 
    return A() 
    def __unicode__(self): 
    print 'Casting B to unicode' 
    return A() 


>>> b = B() 
>>> str(b) 
Casting B to str 

Traceback (most recent call last): 
    File "<pyshell#47>", line 1, in <module> 
    str(b) 
TypeError: __str__ returned non-string (type A) 
>>> unicode(b) 
Casting B to unicode 

Traceback (most recent call last): 
    File "<pyshell#48>", line 1, in <module> 
    unicode(b) 
TypeError: coercing to Unicode: need string or buffer, A found 

str.mro()unicode.mro() 호출은 모두 basestring의 서브 클래스 말한다. 그러나 __unicode__도 개체를 반환 할 수 있으며 이는 object에서 직접 상속되며 basestring에서 상속되지 않습니다.

내 질문은 실제로 strunicode을 호출하면 어떻게됩니까? strunicode에 사용할 __str____unicode__의 반환 값 요구 사항은 무엇입니까?

+0

찾을 수있는 소스 코드를 살펴 봐야 할 수도 있습니다. – Eric

답변

4

그러나 __unicode__ 또한 직접 객체와 basestring 상속하지 버퍼 개체의 반환 수있다.

올바르지 않습니다. unicode()은 문자열 또는 버퍼을 변환 할 수 있습니다. 전달 된 인수를 기본 인코딩을 사용하여 유니 코드로 변환 할 때 "최선의 시도"입니다 (그 이유는 을 강제로이라고합니다). 그것은 항상 유니 코드 객체를 반환합니다.

그렇다면 제 질문은 str과 unicode가 일 때 실제로 발생합니다. str 및 unicode에서 사용하기위한 __str____unicode__에 대한 반환 값 요구 사항은 무엇입니까?

__str__은 비공식적 인 인간 친화적 인 문자열 표현을 반환해야합니다. 이것은 누군가가 여러분의 객체에 str()을 사용할 때 또는 객체가 print 서술문의 일부일 때 호출됩니다.

__unicode__은 항상 unicode 개체을 반환해야합니다. 이 메서드가 정의되어 있지 않으면 __str__이 호출 된 다음 결과가 유니 코드로 강제 변환됩니다 (unicode()에 전달).

두 번째 예에서는 잘못된 개체가 반환되므로 오류 메시지가 표시됩니다. 첫 번째 예제는 부작용 때문에 __unicode__에서 작동하는 것으로 보이지만 올바르게 작성되지 않았습니다.

문서의 data model 섹션은 이러한 "마법 방법"에 대한 자세한 내용과 자세한 내용을 읽어야합니다.

+0

반환 할 내용이 나와 있지만 질문은 (최소한 내 의도였습니다) 왜 다른 것을 반환 할 수 없습니까? –

+0

이러한 "마법"메서드에는 특정 프로토콜이 관련되어 있으므로 개체의 _ 데이터 모델의 일부이므로 예상 한 것 이외의 다른 값을 반환하면 예기치 않은 결과가 발생합니다. –