<p>可能(取决于您如何使用dict),<a href="http://docs.python.org/2/library/collections.html#namedtuple-factory-function-for-tuples-with-named-fields" rel="nofollow">^{<cd1>}</a>也是一个解决方案:</p>
<pre><code>from collections import namedtuple
color_dict = {'apple': 'red',
'carrot':'orange',
'grape':'green'}
# Create a namedtuple class
ColorMap = namedtuple('ColorMap', ['apple', 'carrot', 'grape'])
# Create an instance of ColorMap by using the unpacked dictionary
# as keyword arguments to the constructor
color_map = ColorMap(**color_dict)
# Unpack the namedtuple like you would a regular one
apple, carrot, grape = color_map
</code></pre>
<p><strong>优势</strong></p>
<ul>
<li><code>namedtuples</code>非常轻</li>
<li>漂亮的点式属性访问(<code>obj.attr</code>)</li>
</ul>
<p><strong>缺点</strong></p>
<ul>
<li>要像我在最后一行中展示的那样使用解包,如果需要或不需要,您将始终需要解包所有值。也许这适用于你或其他人的用例,也许不是</li>
</ul>
<p>当然,如果<code>namedtuples</code>符合要求,您可以完全跳过中间字典。你知道吗</p>
<hr/>
<p><strong>背景</strong></p>
<p>有些东西和你的玩具语法很相似</p>
<pre><code>apple, grape = foodColors()['apple','grape'] # made up syntax
</code></pre>
<p>几乎有效:</p>
<pre><code>apple, grape = foodColors().values()
</code></pre>
<p>(仅从dict中获取值列表,并将其像常规元组一样解包)。
问题是字典没有排序(它们的键/值对的顺序是任意的)。不是随机的(一点也不),而是任意的,顺序会改变<a href="http://pyvideo.org/video/276/the-mighty-dictionary-55" rel="nofollow">as the dictionary's size changes</a>)。你知道吗</p>
<p>然而,命名元组的字段是有序的(就像规则元组有顺序一样,在<code>namedtuple</code>中,它们只是<em>命名的</em>字段)。因此,在某种程度上,您可以获得字典以及元组等轻量级有序结构的一些好处。这就是为什么它们可以被解包成有序的序列。你知道吗</p>
<p>但是,如果这样做,则依赖于元组中字段的确切顺序,因此放弃了它们提供的一个巨大优势。更多关于<code>namedtuples</code>以及为什么它们很棒的信息,请参见雷蒙德·赫廷格的<a href="http://blip.tv/pycon-us-videos-2009-2010-2011/pycon-2011-fun-with-python-s-newer-tools-4901215" rel="nofollow">PyCon 2011: Fun with Python's Newer Tools</a>。你知道吗</p>