<p>这种用法对你有吸引力吗?在</p>
<p>轻松查找和使用单个条目:</p>
<pre><code>>>> left("10000")
Entry({'parent': '10001', 'key': '10000', 'fkey': 'asdf'})
>>> left("10000")['key']
'10000'
>>> left("10000")['parent']
'10001'
</code></pre>
<p>方便查找家长:</p>
^{pr2}$
<p>轻松查找相关条目:</p>
<pre><code>>>> 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
</code></pre>
<p>特别是在您的问题中有一个例子:父项的外键:</p>
<pre><code>>>> left("10000").parent()['fkey']
'qwer'
</code></pre>
<p>如果是这样的话,这就是密码!课程:</p>
<pre><code>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']]
</code></pre>
<p>以及您提供的数据的用途:</p>
<pre><code>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)
</code></pre>
<p>说明:将每个dict值包装在一个<code>Entry</code>类中,并定义<code>__getitem__</code>,使其可用作dict(或多或少)。拥有一个将主键映射到这些<code>Entry</code>的<code>Dataset</code>类。提供对此数据集的<code>Entry</code>访问,并提供方便的方法<code>.parent()</code>和{<cd7>}。为了使<code>.related()</code>工作,设置“相关”的数据集应该与<code>set_related_dataset</code>在一起,并将其连接在一起。在</p>
<p>现在,您甚至可以只传递<code>Entry</code>s,这样就可以访问相关条目,而不需要同时传入两个数据集。在</p>