ディクショナリへのビューを取得する組み込みの方法はないようです。最も簡単な回避策は、Jochen のアプローチのようです。私の目的に合わせて彼のコードを少し調整しました。
from collections import MutableMapping
class DictView(MutableMapping):
def __init__(self, source, valid_keys):
self.source, self.valid_keys = source, valid_keys
def __getitem__(self, key):
if key in self.valid_keys:
return self.source[key]
else:
raise KeyError(key)
def __len__(self):
return len(self.valid_keys)
def __iter__(self):
for key in self.valid_keys:
yield key
def __setitem__(self, key, value):
if key in self.valid_keys:
self.source[key] = value
else:
raise KeyError(key)
def __delitem__(self, key):
self.valid_keys.remove(key)
d = dict(a=1, b=2, c=3)
valid_keys = ['a', 'c']
d2 = DictView(d, valid_keys)
d2['a'] = -1 # overwrite element 'a' in source dictionary
print d # prints {'a': -1, 'c': 3, 'b': 2}
そのため、方法d2
が異なるため、印刷以外のすべての面で辞書のように動作し__repr__()
ます。dict
からget に継承するに__repr__()
は、 の場合と同様に、すべてのメソッドを再実装する必要がありcollections.OrderedDict
ます。読み取り専用ビューのみが必要な場合は、 および の実装を継承してcollections.Mapping
保存できます。パラメータを選択してコンパクトな形式で渡すと便利です。__setitem__()
__delitem__()
DictView
self.__dict__