Jav*_*vio 4 python list-comprehension python-3.x python-asyncio
我正在使用 Python 3.7.4 和这段代码(MWE):
import asyncio
async def foo(x):
await asyncio.sleep(1)
return [i for i in range(10)]
async def big_foo():
dict_of_lists = {'A': [i for i in range(10)], 'B': [i for i in range(10)]}
return {
key: [
item
for list_item in dict_of_lists[key]
for item in await foo(list_item)
]
for key in ['A', 'B']
}
Run Code Online (Sandbox Code Playgroud)
抛出错误:
File "filename.py", line 13
item
^
SyntaxError: asynchronous comprehension outside of an asynchronous function
Run Code Online (Sandbox Code Playgroud)
该错误消息没有多大帮助,因为它确实位于异步函数内。
for我通过定义显式循环而不是理解来解决这个问题,如下所示:
File "filename.py", line 13
item
^
SyntaxError: asynchronous comprehension outside of an asynchronous function
Run Code Online (Sandbox Code Playgroud)
让我烦恼的是,删除字典外循环也会删除错误。
这有效(显然它没有完成我需要的任务):
async def big_foo():
dict_of_lists = {'A': [i for i in range(10)], 'B': [i for i in range(10)]}
var = {}
for key in ['A', 'B']:
var[key] = []
for list_item in dict_of_lists[key]:
for item in await foo(list_item):
var[key].append(item)
return var
Run Code Online (Sandbox Code Playgroud)
我已经找到答案了。引用一位同事的话:
内部理解是异步的。外面的不是。该函数是异步的。触发错误是因为您在非异步上下文中定义为异步理解 - 错误消息确实是错误的,并且是一个已知的错误。
https://bugs.python.org/issue33346
async for我通过在外部理解中设置一个来修复它。像这样:
async def big_foo():
dict_of_lists = {'A': [i for i in range(10)], 'B': [i for i in range(10)]}
return {
key: [
item
for list_item in dict_of_lists[key]
for item in await foo(list_item)
]
async for key in ['A', 'B']
}
Run Code Online (Sandbox Code Playgroud)
虽然这删除了提到的内容,SyntaxError但它引入了TypeError: 'async for' requires an object with __aiter__ method, got tuple. 因此,解决方案是为其定义一个包装器,但它看起来更像是一种黑客行为,而不是正确的解决方案。
| 归档时间: |
|
| 查看次数: |
2520 次 |
| 最近记录: |