J'essayais IPython avec un module que j'ai créé et il ne montre pas la représentation réelle des objets de classe. Au contraire, il montre quelque chose commeIPython représentation des classes
TheClass.__module__ + '.' + TheClass.__name__
Je fortement utilisation métaclasses dans ce module et j'ai des représentations de classe vraiment significatives qui devraient être présentées à l'utilisateur.
Existe-t-il une méthode IPython spécifique que je peux changer pour rendre la bonne représentation disponible à la place de cette chose d'espace de nom qui est tout à fait inutile dans cette application? Ou, si ce n'est pas possible, comment puis-je personnaliser ma version d'IPython pour montrer l'information que je veux?
EDIT
informations comme complémentaires, si je reçois une classe et changer l'attribut __module__
à, par exemple Aucun, il souffle avec ce retraçage en essayant de montrer la représentation:
Traceback (most recent call last):
... [Huge traceback] ...
File "C:\Python32\lib\site-packages\IPython\lib\pretty.py", line 599, in _type_pprint
name = obj.__module__ + '.' + obj.__name__
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str'
donc mes attentes ont raison et cette fonction est utilisée pour afficher les objets de classe:
def _type_pprint(obj, p, cycle):
J'ai essayé de le personnaliser dans ma classe mais je ne pense pas que je le fais bien. Ce module IPython.lib.pretty
possède un grand dictionnaire reliant type
(le parent des métaclasses) avec cette fonction.
EDIT 2
choses que j'essayé:
- Ajout de la fonction
_repr_pretty_
à métaclasse. Il fonctionne avec les instances mais pas avec les classes ... - Cette fonction est utilisée
IPython.lib.pretty
.for_type(typ, func)
. Il ne change que le grand dictionnaire écrit ci-dessus mais pas la copie faite par l'instanceRepresentationPrinter
... Donc cette fonction n'a aucune utilité ?! - Appel de la fonction magique
%pprint
. Il désactive (ou active) cette jolie fonctionnalité d'impression, en utilisant le Python__repr__
par défaut pour tous les objets. C'est mauvais parce que la jolie impression de listes, dict et beaucoup d'autres sont assez sympa.
La première approche est plus de ce que je veux car elle n'affecte pas l'environnement et est spécifique à cette classe.
Qu'entendez-vous par "représentation"? Voulez-vous dire que vous avez un '__repr__' sur votre classe et qu'il n'est pas appelé? – BrenBarn
@BrenBarn: [Sur la métaclasse.] (Http: // stackoverflow.com/q/4932438/20862) –
@BrenBarn J'ai un '__repr__' dans la ** métaclasse ** et il ne l'appelle pas comme un shell python normal – JBernardo