1

主に非常に大きなネストされた辞書で構成されるオブジェクトがあります。

class my_object(object):
    def __init__(self):
        self.the_dict = {}  # Big, nested dictionary

__ str__ を変更して、オブジェクトを単純に「印刷」することで最上位の辞書をきれいに印刷しました。

    def __str__(self):
        pp = pprint.PrettyPrinter()
        return pp.pformat(self.the_dict)

ここでの私の目標は、ユーザーが IPython でオブジェクトを閲覧するときに、ユーザーの生活を少し楽にすることでした。

print(the_object)  # Pretty-prints entire dict

これはユーザーに辞書全体を表示するために機能しますが、この機能を辞書の一部にも拡張して、ユーザーが次のようなコマンドからきれいに印刷された出力を取得できるようにしたいと考えています。

print(the_object.the_dict['level1']['level2']['level3'])

(「level3」サブディクテーションのみをきれいに印刷します)

これを行うために __ str__ (または同様のもの) を使用する簡単な方法はありますか?

4

3 に答える 3

2

インタラクティブなプロンプトで、好みに応じて選択した組み込み辞書やその他のオブジェクトを出力するカスタムのディスプレイフックを提供できます。

>>> import sys
>>> oldhook = sys.displayhook
>>> sys.displayhook = your_module.DisplayHook(oldhook)

動作は変わりませんprint obj

dictアイデアは、ユーザーがカスタム書式設定をsに使用するかどうかを選択できるということです。

于 2011-11-15T13:25:26.433 に答える
1

ユーザーが言うと

print(the_object.the_dict['level1']['level2']['level3'])

Python はそれを評価the_object.the_dict['level1']['level2']['level3']し、(たとえば) dict であると判断し、それを に渡しprintます。

は dict であるためthe_object.the_dict、残りはthe_objectの制御外です。level1level2、およびを掘り下げるとlevel3、 によって返されるオブジェクトのタイプのみが の動作the_object.the_dict['level1']['level2']['level3']に影響しますprintthe_object__str__メソッドは、それ自体以外には影響しませんthe_object

さらに、ネストされたオブジェクトを印刷するときは、オブジェクトではなく、オブジェクトの をpprint.pformat使用します。reprstr

したがって、必要な動作を得るにはthe_object.the_dict['level1']['level2']['level3']、辞書のようなものに評価する必要がありますが、異なる__repr__...


dict のようなオブジェクト (例: Turtle) を作成し、最後まで使用できTurtlesます。

import collections
import pprint

class Turtle(collections.MutableMapping):
    def __init__(self,*args,**kwargs):
        self._data=dict(*args,**kwargs)
    def __getitem__(self,key):
        return self._data[key]
    def __setitem__(self, key, value):
        self._data[key]=value
    def __delitem__(self, key):
        del self._data[key]
    def __iter__(self):
        return iter(self._data)
    def __len__(self):
        return len(self._data)
    def __contains__(self, x):
        return x in self._data
    def __repr__(self):
        return pprint.pformat(self._data)

class MyObject(object):
    def __init__(self):
        self.the_dict=Turtle()
    def __repr__(self):
        return repr(self.the_dict)

the_object=MyObject()
the_object.the_dict['level1']=Turtle()
the_object.the_dict['level1']['level2']=Turtle()
the_object.the_dict['level1']['level2']['level3']=Turtle({i:i for i in range(20)})
print(the_object)
print(the_object.the_dict['level1']['level2']['level3'])

これを使用するには、ネストされた dict 構造内のすべての dict をTurtles に置き換える必要があります。

しかし、実際には (私の空想的な命名からわかるように)、Turtles を使用することは期待していません。辞書は非常に優れた、最適化されたビルトインです。きれいな印刷を行うためだけに、この中間オブジェクトを追加したくありません。

代わりに、ユーザーに入力するよう説得できる場合

from pprint import pprint

それから彼らはただ使うことができます

pprint(the_object.the_dict['level1']['level2']['level3'])

きれいな印刷を取得します。

于 2011-11-15T11:57:46.330 に答える