python - 检测使用 async def 创建的任何函数
问题描述
我对 Python 3.6+ 中的以下行为感到困惑:
>>> def f1(): pass
>>> def f2(): yield
>>> async def f3(): pass
>>> async def f4(): yield
>>> inspect.isfunction(f1)
True
>>> inspect.isfunction(f2)
True
>>> inspect.iscoroutinefunction(f3)
True
>>> inspect.iscoroutinefunction(f4)
False
同步函数和生成器函数都被检查视为“函数”,但异步生成器函数不被视为“协程函数”。这似乎与文档相反
inspect.iscoroutinefunction(object)
如果对象是协程函数(使用 async def 语法定义的函数),则返回 true。
有没有比同时检查和更好的方法来检测一个函数是否是用 定义的async
,包括生成器函数?iscoroutinefunction
isasyncgenfunction
这可能是因为异步生成器只出现在 3.6 中,但仍然令人费解。
解决方案
异步生成器本身不是协程,不能await
编辑:
>>> loop.run_until_complete(f4())
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/haugh/.pyenv/versions/3.6.6/lib/python3.6/asyncio/base_events.py", line 447, in run_until_complete
future = tasks.ensure_future(future, loop=self)
File "/home/haugh/.pyenv/versions/3.6.6/lib/python3.6/asyncio/tasks.py", line 526, in ensure_future
raise TypeError('An asyncio.Future, a coroutine or an awaitable is '
TypeError: An asyncio.Future, a coroutine or an awaitable is required
我认为您已经确定了检查是否async
用于定义函数的最佳方法:
def async_used(func):
return inspect.iscoroutinefunction(func) or inspect.isasyncgenfunction(func)
推荐阅读
- mongodb - 真正缓慢的 MongoDB 查询背后的原因可能是什么?
- javascript - 打字时增加输入高度
- c++ - const 引用传递的参数的可变左值引用
- android - Android Studio:清单合并失败并出现多个错误
- amazon-web-services - 我无法读取环境变量(Go 中的 aws-lambda)
- linux - 什么是 rtnetlink(linux os),netlink 和 rtnetlink 有什么区别?
- angular - 我在我的 ASP.NET MVC & Entity Framework 项目中输入日期为“10/09/2019”,但在数据库中它保存为“1.1.0001 00:00:00”
- javascript - 循环的文件预览适用于一个项目,两个或多个文件重复上一个文件
- php - 如果有特定的 get 参数,则重定向到新地址
- java - 如何将两个不同的字符串日期转换为单个日期格式