2010-02-03 6 views
2

help(unicode) imprime quelque chose comme:classe unicode en Python

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

mais vous pouvez utiliser quelque chose de différent d'un basestring comme argument, vous pouvez le faire unicode (1) et obtenir U'1. Que se passe-t-il dans cet appel? int n'a pas de méthode __unicode__ à appeler.

Répondre

2

Si __unicode__ existe, il est appelé, sinon il revient à __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

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.

+0

Je veux dire ... ce qui se passe en interne. –

1

S'il n'y a pas de méthode __unicode__, la méthode __str__ sera appelée à la place. Indépendamment de laquelle de ces méthodes est appelée, si un unicode est renvoyé, il sera transmis tel quel. Si un str est renvoyé, il sera décodé en utilisant le codage par défaut, tel que renvoyé par sys.getdefaultencoding(), qui devrait presque toujours être 'ascii'. Si un autre type d'objet est retourné, un TypeError sera levé.

(Il est possible, en rechargeant le module sys, pour changer l'encodage par défaut en appelant sys.setdefaultencoding(), ce qui est fondamentalement toujours une mauvaise idée.)