Identique à 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>'
Si vous voulez vraiment voir les bits sous graveleux, ouvrir le code source de l'interpréteur Python.
Objects/unicodeobject.c#PyUnicode_Type
définit le type unicode
, avec le constructeur .tp_new=unicode_new
.
Étant donné que les arguments optionnels encoding
ou errors
ne sont pas donnés, et un objet unicode
est construit (par opposition à une sous-classe unicode
), Objects/unicodeobject.c#unicode_new
appelle PyObject_Unicode
.
Objects/object.c#PyObject_Unicode
appelle la méthode __unicode__
si elle existe. Si ce n'est pas le cas, il revient à PY_Type(v)->tp_str
(a.k.a. __str__
) ou PY_Type(v)->tp_repr
(a.k.a. __repr__
). Il passe ensuite le résultat à PyUnicode_FromEncodedObject
.
Objects/unicodeobject.c#PyUnicode_FromEncodedObject
trouve qu'une chaîne lui a été attribuée et la transmet à PyUnicode_Decode
, ce qui renvoie un objet unicode
.
Enfin, PyObject_Unicode
retourne à unicode_new
, ce qui renvoie cet objet unicode
. En bref, unicode()
va automatiquement stringifier votre objet s'il le faut. C'est Python qui fonctionne comme prévu.
Je veux dire ... ce qui se passe en interne. –