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