gpt4 book ai didi

python - 为什么我在 mypy 中使用 await 表达式得到无效语法?

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:54 25 4
gpt4 key购买 nike

# file test.py
import asyncio
from inspect import iscoroutine
from typing import Any


async def a():
print('run a')
asyncio.sleep(1)
return 1


async def b():
# type: () -> Any
print('run b')
return a()


async def g():
# type: () -> Any
print('run g')
s = b()
while iscoroutine(s):
print('in g', s)
s = await s
return s


if __name__ == '__main__':
loop = asyncio.get_event_loop()
a = loop.run_until_complete(g())
print('finish ', a)

当使用 python3.6.6 运行上面的代码时,我得到:

run g
in g <coroutine object b at 0x10a980938>
run b
in g <coroutine object a at 0x10a95d620>
run a
finish 1

Process finished with exit code 0

看起来一切都很好。但是在运行 mypy test.py 时,我得到了 test.py:24: error: invalid syntax。这是什么意思?我的代码有问题吗?我的python解释器版本是3.6.6,mypy版本是0.620。

最佳答案

哈,这很奇怪!

我认为这是 typed_ast 中的错误,库 mypy 用于将 Python 源代码转换为抽象语法树。

我能够将您的问题简化为以下内容:

import asyncio

async def g():
# type: () -> None
await asyncio.sleep(1)

这也会在包含“await”的行上出现语法错误。

但是,如果您这样做,错误消息就会消失:

import asyncio

async def g() -> None:
await asyncio.sleep(1)

同样的解决方法(使用类型提示语法而不是注释语法也解决了原始程序的问题)。似乎出于某种原因,基于注释的类型签名语法和 'await' 关键字不能很好地交互。

我怀疑这个问题之前没有被发现的原因是因为大多数使用 async/await 的人也在使用 Python 3 的内置注释语法——当你想要与 Python 兼容时,主要使用类型注释语法2,但 async/await 仅适用于 Python 3...

无论如何,我建议在 mypy 或 typed_ast 的问题跟踪器上提交问题——mypy 团队监控并维护这两个 repo 协议(protocol)。 (或者,如果您准备好并有空闲时间,甚至可以尝试自己解决 typed_ast 中的问题?这对我来说更像是一个疏忽,而不是一个根本上棘手的错误。)

关于python - 为什么我在 mypy 中使用 await 表达式得到无效语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51746724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com