2010-02-03 3 views
2

help(unicode) печатает что-то вроде:юникод класса в Python

class unicode(basestring) 
| unicode(string [, encoding[, errors]]) -> object 
... 

но вы можете использовать что-то другое из basestring в качестве аргумента, вы можете сделать Юникод (1) и получить u'1. Что происходит в этом звонке? int не имеет метода __unicode__.

ответ

2

Если __unicode__ существует, то она называется, в противном случае он возвращается к __str__

class A(int): 
    def __str__(self): 
     print "A.str" 
     return int.__str__(self) 

    def __unicode__(self): 
     print "A.unicode" 
     return int.__str__(self) 

class B(int): 
    def __str__(self): 
     print "B.str" 
     return int.__str__(self) 


unicode(A(1)) # prints "A.unicode" 
unicode(B(1)) # prints "B.str" 
2

То же, что и unicode(str(1)).

 
>>> class thing(object): 
...  def __str__(self): 
...   print "__str__ called on " + repr(self) 
...   return repr(self) 
... 
>>> a = thing() 
>>> a 
<__main__.thing object at 0x7f2f972795d0> 
>>> unicode(a) 
__str__ called on <__main__.thing object at 0x7f2f972795d0> 
u'<__main__.thing object at 0x7f2f972795d0>' 

Если вы действительно хотите увидеть песчаные биты внизу, откройте исходный код интерпретатора Python.

Objects/unicodeobject.c#PyUnicode_Type определяет тип unicode, с конструктором .tp_new=unicode_new.

Поскольку необязательные аргументы encoding или errors не даны, а unicode объект строится (в отличие от unicode подкласса), Objects/unicodeobject.c#unicode_new называет PyObject_Unicode.

Objects/object.c#PyObject_Unicode вызывает метод __unicode__, если он существует. Если нет, он возвращается к PY_Type(v)->tp_str (a.k.a. __str__) или PY_Type(v)->tp_repr (a.k.a. __repr__). Затем он передает результат PyUnicode_FromEncodedObject.

Objects/unicodeobject.c#PyUnicode_FromEncodedObject находит, что ему была предоставлена ​​строка, и передает ее на номер PyUnicode_Decode, который возвращает объект unicode.

И наконец, PyObject_Unicode возвращается к unicode_new, который возвращает этот объект unicode.

Короче говоря, unicode() автоматически стяжет ваш объект, если это необходимо. Это Python работает как ожидалось.

+0

... Я имею в виду то, что происходит внутри. –

1

Если нет __unicode__ метода, метод __str__ будет называться вместо этого. Независимо от того, какой из этих методов вызывается, если возвращается unicode, он будет передан как есть. Если возвращается str, он будет декодирован с использованием кодировки по умолчанию, возвращенной sys.getdefaultencoding(), которая должна быть всегда всегда 'ascii'. Если возвращается какой-либо другой объект, то будет поднят TypeError.

(Возможно, путем перезагрузки модуля Sys, чтобы изменить кодировку по умолчанию, вызвав sys.setdefaultencoding(), это в основном всегда плохая идея.)

Смежные вопросы