擅长:python、mysql、java
<p>由于decorator和递归之间的交互,它无法工作。因为生成器是递归的,所以它依赖于某种递归关系。通过在生成器和子生成器之间注入一个修改的decorator,您将破坏该递归关系。</p>
<p>只要<code>@dec</code>删除最后一个元素,就不能通过单独更改<code>@dec</code>使其与<code>gen1()</code>兼容。</p>
<p>但是,您可以更改<code>gen1()</code>,使其与<code>@dec</code>兼容:</p>
<pre><code>def dec(gen):
def new_gen(x):
g = gen(x)
value = g.next()
for v in g:
yield value
value = v
return new_gen
@dec
def gen1(x):
def gen2(x):
if x <= 10:
yield x
for v in gen2(x + 1):
yield v
for v in gen2(x):
yield v
for i in gen1(1):
print i # Prints 1 to 9, as needed
</code></pre>
<p>这里的技巧是使<code>gen1()</code>非递归,并将所有工作委托给另一个未修饰的生成器。后者可以是递归的。</p>