擅长:python、mysql、java
<p>您在生成器表达式中使用没有参数的<code>super()</code>。<code>super()</code>很神奇-它依赖于调用方帧中的信息。由于生成器表达式创建了一个附加函数,因此没有参数的<code>super()</code>在那里不起作用。但是,由于超类不太可能在方法的执行过程中更改<em>,因此可以将其移出生成器表达式-这也可以加快速度:</p>
<pre><code>def to_expr(self):
bracket_complex = super().bracket_complex
return (" " + str(self.op) + " ").join(bracket_complex(child) for child in self.children)
</code></pre>
<p>但是,由于静态方法在Python中是“继承”的,所以可以通过<code>self</code>调用超级方法,前提是没有在子类中重写它。因此,在这个简单的例子中,你可以写下:</p>
^{pr2}$
<hr/>
<p>实现细节是,如果没有提供参数,第一个参数应该是调用者帧的<code>__class__</code>单元格中的值,第二个参数应该是给调用者函数的第一个参数。通常,在错误的位置使用<code>super</code>时,只会得到一个<code>SystemError</code>,但是生成器表达式被包装在一个隐式生成器函数中,该函数会创建另一个调用帧。不幸的是,这个函数得到一个参数,这导致<code>super()</code>抱怨这个异常。在</p>
<p>因此,通常<code>super()</code>将作为第一个参数传递给<code>Foo</code>,但在生成器表达式中,传递了一个生成器对象,因此很明显需要引发{<cd11>}。在</p>