<p>首先,这不起作用的原因是:</p>
<pre><code>a = lamdba: pass
</code></pre>
<p>…是<a href="http://docs.python.org/3/reference/expressions.html#lambda">^{<cd1>}</a>只允许表达式,并定义返回表达式值的函数。因为<a href="http://docs.python.org/3/reference/simple_stmts.html#the-pass-statement">^{<cd2>}</a>是一个语句,而不是表达式,所以这是非法的。</p>
<p>不过,这很管用:</p>
<pre><code>a = lambda: None
</code></pre>
<p>在Python中,没有<code>return</code>语句就从末尾掉下来的函数总是返回<code>None</code>。所以,它们是等价的:</p>
<pre><code>def a(): return None
def a(): pass
</code></pre>
<p>但是,我不明白为什么要把它写成lambda和赋值;<code>def</code>更短,可读性更强,并且给了您一个名为<code>a</code>而不是<code><lambda></code>的可内省函数对象,等等。使用<code>lambda</code>的唯一原因是不想给函数命名,或者需要在表达式中定义函数。显然这两种情况都不是真的,因为直接在赋值语句中使用<code>lambda</code>。所以,只要使用<code>def</code>。</p>
<hr/>
<p>同时,这在某种意义上是一个“空函数”,或者至少是尽可能空的(正如您可以看到的,例如,调用<code>dis.dis(a)</code>,仍然需要两个字节码来做任何事情,但从末尾掉下来并返回<code>None</code>),但这对您的情况没有用处。你不想要一个“空函数”。如果您尝试将<code>a</code>传递给<code>map</code>,您将得到一个<code>TypeError</code>,因为您试图用一个参数调用一个没有参数的函数。(因为这就是<code>map</code>所做的。)</p>
<p>您可能需要的是一个<em>identity</em>函数,它只是按原样返回其参数。像这样:</p>
<pre><code>def a(x): return x
</code></pre>
<p>但我不确定这是你想要的。你想像那样附加<code>data</code>吗?或者你想做一些不同的事情,比如提前返回,或者引发异常,或者不附加任何东西,或者…?</p>
<hr/>
<p>最后,我不明白你为什么想要一个函数。如果没有要映射的内容,为什么不直接调用<code>map</code>?您有一个非常好的<code>else</code>子句,它已经捕捉到了这种情况(如果您想做的是提前返回或引发…,则特别方便)。或者,如果您愿意,可以从<code>f = None</code>开始,然后使用<code>if f:</code>来决定是否映射。或者,如果你真的想:</p>
<pre><code>added_property = [f(element) if f else element for element in data]
</code></pre>
<p>……或者</p>
<pre><code>added_property = map(f, data) if f else data
</code></pre>
<hr/>
<p>最后一点,您可能需要一个<code>if</code>/<code>elif</code>链,而不是一个反复重复同一件事情的长链,而是一个<code>dict</code>:</p>
<pre><code>propfuncs = {'prop1': make_property1(),
'prop2': make_property2(),
'prop3': make_property3(),
'prop4': make_property4()}
</code></pre>
<p>然后,所有的原油变成了这两条线:</p>
<pre><code>f = propfuncs.get(self.property_currently_being_added)
added_property = map(f, data) if f else data
</code></pre>
<p>或者,一个更好的设计可能是用一个单独的函数替换所有那些<code>make_propertyN</code>函数,您称之为<code>make_property(1)</code>或<code>make_property('prop1')</code>…但是如果没有看到它们实际做了什么,我就无法确定。</p>