7
votes

Un module Python peut-il avoir un __repr__?

Un module Python peut-il avoir un __repr__? L'idée serait de faire quelque chose comme: xxx

édition: précision: je veux dire un défini par l'utilisateur REC!


0 commentaires

5 Réponses :


2
votes

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__ !


3 commentaires

REC n'est pas dans mes attributs SYS (Python 2.6.2)


Pour ce que ça vaut, j'ai trouvé sys .__ REC __ dans mon python (2.5.1), mais je pense que ce n'est pas ce qui est imprimé avec imprimé (SYS) .


En Python 2.6.2 __ RECR __ n'est pas dans dir (sys) ou sys .__ dict __ . Cependant, il s'agit d'une clé valide dans sys .__ classe __.__ dict__ '( REC 'd'objets "Module"> `).



6
votes

Les modules peuvent avoir une fonction __ rep __ , mais ce n'est pas invoqué lors de la représentation d'un module.

Donc non, vous ne pouvez pas faire ce que vous voulez.


0 commentaires

10
votes

réponse courte forte>: essentiellement la réponse est non.

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)>"


2 commentaires

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/... .



1
votes

Non, car __ RECR __ est une méthode spéciale (je l'appelle une capacité ), 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 __ , il ne serait pas appelé!


0 commentaires

9
votes

Vous pouvez atteindre cet effet - si vous êtes prêt à vous rendre au côté obscur de la force.

Ajouter ceci à MyModule.py: < / p> xxx

lo et voici: xxx

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 __ . 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.


1 commentaires

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.