この使用法はあなたにとって魅力的ですか?
単一エントリの簡単な検索と使用:
>>> left("10000")
Entry({'parent': '10001', 'key': '10000', 'fkey': 'asdf'})
>>> left("10000")['key']
'10000'
>>> left("10000")['parent']
'10001'
親の簡単な検索:
>>> left("10000").parent()
Entry({'parent': '', 'key': '10001', 'fkey': 'qwer'})
>>> left("10000").parent().parent()
>>> left("10001")
Entry({'parent': '', 'key': '10001', 'fkey': 'qwer'})
>>> left("10001") is left("10000").parent()
True
関連エントリの簡単な検索:
>>> left("10001").related()
Entry({'parent': '', 'key': 'qwer', 'fkey': '10001'})
>>> right("qwer")
Entry({'parent': '', 'key': 'qwer', 'fkey': '10001'})
>>> right(left("10001").related()['key'])
Entry({'parent': '', 'key': 'qwer', 'fkey': '10001'})
>>> right("qwer") is left("10001").related()
True
特にあなたの質問の例は次のとおりです: 親の外部キー:
>>> left("10000").parent()['fkey']
'qwer'
もしそうなら、ここにコードがあります!クラス:
class Entry(object):
def __init__(self, dataset, d):
self.dataset = dataset
self.d = d
def parent(self):
return self.dataset.parent_of(self)
def related(self):
if not self.dataset.related_dataset:
raise ValueError("no related dataset specified")
return self.dataset.related_dataset(self['fkey'])
def __getitem__(self, k):
return self.d.__getitem__(k)
def __repr__(self):
return "Entry(%s)" % repr(self.d)
def __str__(self):
return str(self.d)
class Dataset(object):
def __init__(self, data):
self.data = dict((k, Entry(self, v)) for (k,v) in data.items())
self.related_dataset = None
def set_related_dataset(self, dataset):
self.related_dataset = dataset
def entry(self, key):
if isinstance(key, Entry): return key
return self.data[key]
def __call__(self, key):
return self.entry(key)
def parent_of(self, entry):
entry = self.entry(entry)
if not entry['parent']:
return None
return self.data[entry['parent']]
そして、あなたが提供したデータの使用法:
leftdata = {'10000': { 'key': '10000', 'fkey':'asdf', 'parent':'10001'},
'10001': { 'key': '10001', 'fkey':'qwer', 'parent':''},}
rightdata = {'asdf': { 'key': 'asdf', 'fkey':'10000', 'parent':'qwer'},
'qwer': { 'key': 'qwer', 'fkey':'10001', 'parent':''}}
left = Dataset(leftdata)
right = Dataset(rightdata)
left.set_related_dataset(right)
right.set_related_dataset(left)
Entry
説明: 各辞書値を定義済みのクラスにラップ__getitem__
して、辞書として (多かれ少なかれ) 使用できるようにします。Dataset
主キーをこれらの にマップするクラスを用意しますEntry
。Entry
このデータセットへのアクセスを提供し、便利なメソッド.parent()
とを提供し.related()
ます。が機能するため.related()
には、「関連する」データセットをどのデータセットに含めるかを設定しset_related_dataset
、すべてを結び付けます。
s を渡すだけでもEntry
、両方のデータセットを渡す必要なく、関連するエントリにアクセスできるようになりました。