2

作成したモジュールでIPythonを試しましたが、クラスオブジェクトの実際の表現が表示されません。代わりにそれは次のようなものを示しています

TheClass.__module__ + '.' + TheClass.__name__

このモジュールではメタクラスを多用しており、ユーザーに表示する必要のある本当に意味のあるクラス表現があります。

このアプリケーションではまったく役に立たないこの名前空間の代わりに、正しい表現を利用できるようにするために変更できるIPython固有のメソッドはありますか?

または、それが不可能な場合、IPythonのバージョンをカスタマイズして必要な情報を表示するにはどうすればよいですか?


編集

補足情報として、クラスを取得して__module__属性をたとえばNoneに変更すると、表現を表示しようとすると、このトレースバックが発生します。

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'

したがって、私の期待は正しかったので、この関数はクラスオブジェクトを表示するために使用されます。

def _type_pprint(obj, p, cycle):

クラスでカスタマイズしてみましたが、うまくいかないと思います。このモジュールには、この関数とリンクしている(メタクラスの親)IPython.lib.pretty大きな辞書があります。type


編集2

私が試したこと:

  1. _repr_pretty_関数をメタクラスに追加します。インスタンスでは機能しますが、クラスでは機能しません...
  2. この関数を使用します。上に書いた大きな辞書を変更するだけで、インスタンスによって作成されたそのコピーは変更されません...したがって、この関数はまったく役に立ちませんか?!IPython.lib.pretty.for_type(typ, func)RepresentationPrinter
  3. 魔法の関数を呼び出す%pprint__repr__すべてのオブジェクトにデフォルトのPythonを使用して、このきれいな印刷機能を無効(または有効)にします。リスト、dict、その他多くのきれいな印刷がとてもいいので、それは悪いことです。

最初のアプローチは、環境に影響を与えず、このクラスに固有であるため、私が望むものです。

4

1 に答える 1

1

これは、IPython0.12以前のバージョンの問題です。これで、次のことが可能になります。

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

の目的の表現が表示されBます。

于 2012-09-04T15:13:13.740 に答える