ユーザーが言うと
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
の制御外です。level1
、level2
、およびを掘り下げるとlevel3
、 によって返されるオブジェクトのタイプのみが の動作the_object.the_dict['level1']['level2']['level3']
に影響しますprint
。the_object
の__str__
メソッドは、それ自体以外には影響しませんthe_object
。
さらに、ネストされたオブジェクトを印刷するときは、オブジェクトではなく、オブジェクトの をpprint.pformat
使用します。repr
str
したがって、必要な動作を得るには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 をTurtle
s に置き換える必要があります。
しかし、実際には (私の空想的な命名からわかるように)、Turtle
s を使用することは期待していません。辞書は非常に優れた、最適化されたビルトインです。きれいな印刷を行うためだけに、この中間オブジェクトを追加したくありません。
代わりに、ユーザーに入力するよう説得できる場合
from pprint import pprint
それから彼らはただ使うことができます
pprint(the_object.the_dict['level1']['level2']['level3'])
きれいな印刷を取得します。