2012-09-03 5 views
2

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é:

  1. Ajout de la fonction _repr_pretty_ à métaclasse. Il fonctionne avec les instances mais pas avec les classes ...
  2. 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'instance RepresentationPrinter ... Donc cette fonction n'a aucune utilité ?!
  3. 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.

+0

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

+0

@BrenBarn: [Sur la métaclasse.] (Http: // stackoverflow.com/q/4932438/20862) –

+0

@BrenBarn J'ai un '__repr__' dans la ** métaclasse ** et il ne l'appelle pas comme un shell python normal – JBernardo

Répondre

1

Ceci est juste un issue avec IPython 0.12 et les versions plus anciennes. Il est maintenant possible de le faire:

class A(type): 
    def _repr_pretty_(cls, p, cycle): 
     p.text(repr(self)) 

    def __repr__(cls): 
     return 'This Information' 

class B: #or for Py3K: class B(metaclass=A): 
    __metaclass__ = A 

et il va montrer la représentation souhaitée pour B.