класс юникода в Python - PullRequest
       15

класс юникода в Python

2 голосов
/ 03 февраля 2010

help(unicode) печатает что-то вроде:

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

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

Ответы [ 3 ]

2 голосов
/ 03 февраля 2010

Если существует __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 голосов
/ 03 февраля 2010

То же, что и 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 работает как положено.

1 голос
/ 03 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...