[gull] Types : [was: Php/MsSQL obsoletes?]

Daniel Cordey dc at mjt.ch
Thu Sep 29 14:33:24 CEST 2005


On Thursday 29 September 2005 14:04, Leopoldo Ghielmetti wrote:

> Pas tout a fait exact:
> Python 2.3.3 (#1, Feb  5 2005, 16:22:10)
> [GCC 3.3.3 (SuSE Linux)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>
> >>> class toto:
>
> ...   def __init__(self):
> ...     pass
> ...
>
> >>> a=toto()
> >>> print a
>
> <__main__.toto instance at 0x4039828c>
>
>
> Pas d'exception!

Mea culpa... Chaque instantiation d'objet possede un appel implicite a un 
equivalent '@poperty' de self... lorsque l'on accede a la methode __repr__. 
En redefinissant cette methode :

class toto :
    def __init__(self) :
        pass

    def __repr__(self) :
        return "fake..."

a = toto()
print "%s" % a

A l'execution :

dc at ...> python except.py
fake...
dc at ...>

Il se trouve que python va faire appel a __repr__ seulement si __str__ 
n'existe pas. Dans le cas ou __str__ existe, __repr__ est simplement ignore.
Mais en l'absence de __str__, si la valeur de retour n'est pas de type 'str', 
nous avons une exception. EN remplacant :

	return "fake..."

par 

	return 123

print ca reconnaitre que 123 n'est pas un 'str', et donc cherche a appele la 
methode __str__ de l'objet 'a'. Or il n'y en a pas. Execution :

Traceback (most recent call last):
  File "except.py", line 10, in ?
    print "%s" % a
TypeError: __str__ returned non-string (type int)


La preuve ? Il suffit de definir :

    def __str__(self) :
        return 'New 123...'

dans la classe 'toto' et l'execution donne :

New 123...

Or, __repr__ n'est appele que si __str__ n'existe pas.

Voila :-)

dc







More information about the gull mailing list