<p>这里的问题是<code>tuple</code>使用同步迭代器协议</p>
<p>尤鲁·塞利万诺夫回答说:</p>
<blockquote>
<blockquote>
<p>... result = list(await g(i) for i in range(3))</p>
</blockquote>
<p>这相当于此代码:</p>
<pre><code> async def ait():
for i in range(3):
v = await g(i)
yield v
result = list(ait())
</code></pre>
<p>其中<code>ait</code>是一个异步生成器函数。不能使用常规的<code>for x in ...</code>语法对其进行迭代,也不能将其传递给需要同步迭代器的函数(例如<code>list</code>)</p>
<p>类似地,对于同步代码:</p>
<pre><code> a = (i for i in range(3))
a[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'generator' object is not subscriptable
</code></pre>
<p>其中(<code>for ...</code>)是定义同步发电机的另一种语法</p>
<blockquote>
<p>... <code>result = [await g(i) for i in range(3)]</code></p>
</blockquote>
<p>这相当于此代码:</p>
<pre><code> result = []
for i in range(3):
v = await g(i)
result.append(v)
</code></pre>
<p>我同意PEP530对此有点模糊,可以更新。我会调查一下的</p>
<p>也许我们可以让“TypeError:‘async_generator’object is not iterable”错误消息更清楚一点。欢迎提出任何改进意见</p>
<blockquote>
<p>I would say that the first case should either behave as a second one, or raise a syntax error.</p>
</blockquote>
<p>没有,但我们可以改进错误消息</p>
</blockquote>