<p>我认为,最好的方法是<strong>而不是</strong>这样做-<code>'*'</code>是dict中一个完全有效的键,因此<code>myiter['*']</code>有一个定义明确的含义和有用性,颠覆肯定会引起问题。如何“glob”在<strong>不是</strong>字符串的键上,包括列表而不是映射的元素中的独占整数“键”(索引),也是一个相当大的设计问题。在</p>
<p>如果您仍然<strong>必须</strong>这样做,我建议您通过将<a href="http://docs.python.org/library/collections.html#abcs-abstract-base-classes" rel="nofollow noreferrer">abstract base class</a><code>collections.MutableMapping</code>子类化来实现完全控制,<em>实现所需的方法(<code>__len__</code>,<code>__iter__</code>,<code>__getitem__</code>,<code>__setitem__</code>,<code>__delitem__</code>,为了获得更好的性能,还可以覆盖其他方法,如<code>__contains__</code>,ABC确实在其他方法的基础上实现这些方法,但是慢慢地)就包含的<code>dict</code>而言。相反,根据其他建议,子类化<code>dict</code>将需要重写大量方法,以避免在重写的方法中使用“包含通配符的键”与不重写的方法之间的不一致行为</p>
<p>无论您是子类<code>collections.MutableMapping</code>,还是<code>dict</code>,要生成您的<code>Globbable</code>类,您必须做出一个核心设计决策:当<code>yourthing</code>是<code>Globbable</code>时,<code>yourthing[somekey]</code><em>返回的是什么?在</p>
<p>当<code>somekey</code>是一个包含通配符的字符串时,它可能必须返回不同的类型,而不是其他类型。在后一种情况下,我们可以想象,在该条目中实际是什么;但是在前一种情况下,它不能仅仅返回另一个<code>Globbable</code>——否则,在一般情况下,<code>yourthing[somekey] = 'bah'</code><strong>会做什么</strong>?对于您的单个“slick syntax”示例,您希望它在<code>yourthing</code>的每个<em>项中设置一个<code>somekey</code>项(一个<strong>巨大的</strong>语义与宇宙中其他映射的行为相分离;—)——但是,那么,您如何在<code>yourthing</code>中设置一个条目呢?!在</p>
<p>让我们看看Python的禅宗对你渴望的“流畅的语法”有什么要说的…:</p>
<pre><code>>>> import this
...
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
</code></pre>
<p>暂时考虑一下另一种选择,即放弃“流畅的语法”(以及它必然意味着的所有<strong>巨大的</strong>语义上的麻烦)而倾向于清晰和简单(这里使用Python2.7和更好的语法,只是为了理解dict——如果您坚持使用2.6或更早版本,请使用显式的<code>dict(...)</code>调用),例如:</p>
^{pr2}$
<p>所以你的任务可能变成</p>
^{3}$
<p>(带有<code>'*'</code>的选择是多余的,我只是省略它)。这是不是太可怕了,值得我在上面提到的一大堆问题来代替它</p>
<pre><code>myiter['*']['*.txt']['name'] = 'Woot'
</code></pre>
<p>。。。?当然,到目前为止,最清晰和最好的执行方式仍然是更简单的</p>
<pre><code>def match(k, v, pat):
try:
if fnmatch.fnmatch(k, pat):
return isinstance(v, dict)
except TypeError:
return False
for k, v in myiter.items():
if match(k, v, '*'):
for sk, sv in v.items():
if match(sk, sv, '*.txt'):
sv['name'] = 'Woot'
</code></pre>
<p>但是如果你绝对渴望简洁和紧凑,轻视Python的koan“稀疏胜于密集”的禅意,你至少可以不必做我提到的各种噩梦来实现你理想的“语法糖”。在</p>