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__