То же, что и 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 работает как ожидалось.
... Я имею в виду то, что происходит внутри. –