这种用法对你有吸引力吗?
轻松查找和使用单个条目:
>>> 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)
说明:将每个 dict 值包装在一个已定义的Entry
类中,__getitem__
以使其可用作 dict(或多或少)。有一个Dataset
将主键映射到这些Entry
s 的类。提供Entry
对该数据集的访问并提供方便的方法.parent()
和.related()
. 为了.related()
工作,设置“相关”的数据集应该与哪个数据集相关set_related_dataset
联。
现在您甚至可以只传递Entry
s 并且您将能够访问相关条目而无需传递两个数据集。