2017-01-03 5 views
4

デフォルトでは、IPythonがオブジェクトを表示するとき、それは__repr__を使うようです。出力のために `__repr__`の代わりにオブジェクトの` __str__`を使うようにIPythonに指示します

__repr__は、適切な環境でオブジェクトを再構成するために使用できるユニークな文字列を生成すると想定されています。 これは人間が読める出力を生成すると思われる__str__とは異なります。

ここで、特定のクラスを作成し、デフォルトで(つまり、明示的にprintまたは__str__を呼び出すことなく)IPythonに人間が読める出力を生成させたいとします。 私たちのクラスを__repr__ do __str__の仕事にすることで、ファジイしたくないです。 それはルールを破るだろう。

デフォルトで特定のクラスに対して__str__を呼び出すようにIPythonに指示する方法はありますか?

+0

関連:https://stackoverflow.com/questions/28304092/when-i-am-in-the-python-or-ipython-console-what-is-called-when-i-am-returned-an –

+1

私が知っている限り、「通常の」解決策は、奇妙な '__repr__'を書くことです。例えば、パンダのデータフレームがこれを実行します。 – user2357112

+1

@ user2357112 Awww :-( – DanielSank

答えて

5

これは確かに可能です。インスタンスメソッド_repr_pretty_(self)を実装するだけで済みます。これは、documentation for IPython.lib.prettyに記載されています。 pパラメータがメソッドあなたが出力に使用すると、書式設定しているオブジェクトのテキスト表現を使用する必要がありますIPython.lib.pretty.PrettyPrinter、のインスタンスである

class MyObject: 
    def _repr_pretty_(self, p, cycle): 
     p.text(str(self) if not cycle else '...') 

:その実装は、次のようなものを見ることができます。通常はp.text(text)を使用しますが、書式付きの表現にそのまま与えられたtextが追加されますが、クラスがコレクションを表す場合は、開始グループと終了グループなどの作業を行うことができます。

cycleパラメータは、参照サイクルが検出されたかどうか、つまり同じ呼び出しスタックでオブジェクトを2回フォーマットするかどうかを示すブール値です(無限ループにつながります)。使用しているオブジェクトの種類に応じて考慮する必要はあるかもしれませんが、傷つけることはありません。あなたはそのコードがクラスのためにこれをしたい場合は、へのアクセス権を持っていないんボーナスとして


、修正(または、より正確に、したくない)、またはあなただけしたい場合テストのために一時的な変更を行うには、this example of customizing int displayに示すように、IPython表示フォーマッタのfor_typeメソッドを使用できます。あなたのケースでは、あなたがの印刷をカスタマイズしたいタイプを表すもちろんMyObject

get_ipython().display_formatter.formatters['text/plain'].for_type(
    MyObject, 
    lambda obj, p, cycle: p.text(str(obj) if not cycle else '...') 
) 

を使用します。ラムダ関数は_repr_pretty_と同じシグネチャを持ち、同じように動作することに注意してください。

関連する問題