Parfois quand on veut debug, on souhaite voir le contenu de nos objets à la manière du Data::Dumper de Perl, on utilise __repr__ pour avoir la représentation des nos objets Python. Cette implémentation par introspection nous permet de créer une représentation avec la valeur des champs de l'objet lors de l'appel au constructeur __init__.

Ce code marche seulement si l'objet à une méthode __init__

class Plouf:
    def __init__(self, bidule, machininstance, truc="muche", toto=42):
        self.bidule = bidule
        self.machininstance = machininstance
        self.truc = truc
        self.toto = toto
 
    def __repr__(self):
        str = "<%s(%s)>" % (self.__class__.__name__, ", ".join(
            repr(getattr(self, f)) for f in getattr(self,"__init__").im_func.func_code.co_varnames[1:]
        ))
        return str
 
class Machin:
    def __init__(self, foo, bar="bar", baz=342):
        self.foo = foo
        self.bar = bar
        self.baz = baz
 
    def __repr__(self):
        str = "<%s(%s)>" % (self.__class__.__name__, ", ".join(
            repr(getattr(self, f)) for f in getattr(self,"__init__").im_func.func_code.co_varnames[1:]
        ))
        return str

Voyons ce que ça nous donne en sortie:

In [6]: machin = Machin("foo")
 
In [7]: plouf = Plouf("bidule", machin)
 
In [8]: machin
Out[8]: <Machin('foo', 'bar', 342)>
 
In [9]: plouf
Out[9]: <Plouf('bidule', <Machin('foo', 'bar', 342)>, 'muche', 42)>
 
In [10]:

Et voilà, yapluka:

self.logger.log(DEBUG, "blablabla %r" % plouf)

Note: pour le formattage de chaines, %s représente le résultat de __str__ et %r celui de __repr__

python/repr.txt · Last modified: 2010/01/12 13:29 (external edit)
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0