<p><em>我不太明白为什么还要将密钥也存储在值中。这违背了词典的概念。</em></p>
<p>如果您只是在返回值时将键添加到值中,这样您就有了一些自定义的dict:</p>
<pre><code>users = c_dict(
a = ('user', 'address', 987),
# ...
)
</code></pre>
<p>在获得值后,将键添加到返回中:</p>
<pre><code>In [32]: users['a']
Out[32]: ('user_a', 'address_a', 987)
</code></pre>
<p>要实现这一点,您可以<strong>子类<code>dict</code>并仅覆盖<code>__getitem__</code>方法</strong>:</p>
<pre><code>class c_dict(dict):
def __getitem__(self, key):
val = super(c_dict, self).__getitem__(key)
if isinstance(val, tuple):
return tuple(
'{0}_{1}'.format(el, key)
if isinstance(el, str)
else el
for el in val
)
else:
return val
</code></pre>
<p>此自定义词典<code>c_dict</code>的行为将与普通词典类似,除非您获得一个<code>tuple</code>类型的值,该值包含<code>str</code>类型的元素,在该类型中,chase键被添加到元素中,但仅在返回它们时才执行。你知道吗</p>
<p>使用这种方法,您不必将键存储在值中,它可以保持概念上的分离完好无损。你知道吗</p>
<p><strong>您可以轻松地在普通<code>dict</code>和此自定义<code>c_dict</code></strong>之间切换。因此,如果您想摆脱这种返回值的特殊方式,只需执行<code>users = dict(users)</code>,<code>users</code>也是一种简单的<code>dict</code>。这两种方法都有效:</p>
<pre><code>In [41]: users = {'a': ('user', 'address', 12)}
In [42]: users['a']
Out[42]: ('user', 'address', 12)
In [43]: users = c_dict(users)
In [44]: users['a']
Out[44]: ('user_a', 'address_a', 12)
In [45]: users = dict(users)
In [46]: users['a']
Out[46]: ('user', 'address', 12)
</code></pre>
<p>希望这有帮助。快乐的编码!</em></p>