Un module Python peut-il avoir un __repr__? L'idée serait de faire quelque chose comme: édition: précision: je veux dire un défini par l'utilisateur fort> REC! P> p> p>
5 Réponses :
En fait, de nombreux modules font [avoir un __ RECR __ code>]! >>> import sys
>>> print(sys)
<module 'sys' (built-in)> #read edit, however, this info didn't come from __repr__ !
REC B> n'est pas dans mes attributs SYS (Python 2.6.2)
Pour ce que ça vaut, j'ai trouvé sys .__ REC __ code> dans mon python (2.5.1), mais je pense que ce n'est pas ce qui est imprimé avec imprimé (SYS) code>.
En Python 2.6.2 __ RECR __ code> n'est pas dans dir (sys) code> ou sys .__ dict __ code>. Cependant, il s'agit d'une clé valide dans sys .__ classe __.__ dict__ '( code>
Les modules peuvent avoir une fonction Donc non, vous ne pouvez pas faire ce que vous voulez. p> __ rep __ code>, mais ce n'est pas invoqué lors de la représentation d'un module. p>
Mais vous ne trouvez pas la fonctionnalité que vous recherchez avec Docstrings? p> >>> import sys # we import the module
>>> sys.__repr__() # works as usual
"<module 'sys' (built-in)>"
>>> sys.__dict__['__repr__'] # but it's not in the modules __dict__ ?
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: '__repr__'
>>> sys.__class__.__dict__['__repr__'] # __repr__ is provided on the module type as a slot wrapper
<slot wrapper '__repr__' of 'module' objects>
>>> sys.__class__.__dict__['__repr__'](sys) # which we should feed an instance of the module type
"<module 'sys' (built-in)>"
Je serais intéressé à entendre l'explication de Alex Martelli ;-)
Christophe: Je vais vous sauver le problème, comme il m'a dit pourquoi, voir Stackoverflow.com/Questtions/1060796/CALABLABLE-MODULES et Stackoverflow.com/Questtions/1725515/... .
Non, car __ RECR __ code> est une méthode spéciale (je l'appelle une capacité em>), et ce n'est jamais recherché sur la classe. Votre module n'est qu'une autre instance du type de module, il vous suffirait donc de définir un __ RECR __ code>, il ne serait pas appelé! P>
Vous pouvez atteindre cet effet - si em> vous êtes prêt à vous rendre au côté obscur de la force. Ajouter ceci à MyModule.py: strong> strong> < / p> lo et voici: p> Je me souviens mal, lors de tentatives précédentes sur des hacks diaboliques similaires, avoir des problèmes de mise en place des attributs spéciaux Comme __ classe __ code>. Je n'ai pas eu ce problème lorsque vous testez cela. Si vous rencontrez ce problème, saisissez simplement l'exception et sautez cet attribut. P> P>
C'est la meilleure réponse, honte que ce ne soit pas classé plus haut. En outre, ce n'est pas vraiment un piratage "mal" IMHO: la seule valeur que vous modifiez au niveau SYS est le nom du module lui-même. Je pense que le propriétaire d'un module devrait être capable de modifier sans quoi ce module.