我对Python 3.6+中的以下行为感到困惑:
NOTE3
同步检查功能和生成器功能均被检查视为“功能”,而异步生成器功能则不被视为“协程功能”。 这似乎与documentation
相反
>>> 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
如果对象是协程函数(使用异步def语法定义的函数),则返回true。
有没有比检查inspect.iscoroutinefunction(object)
和async
更好的方法来检测是否用iscoroutinefunction
定义了一个函数,包括生成器函数?
这可能是由于异步生成器仅在3.6中出现,但仍令人困惑。
答案 0 :(得分:1)
异步生成器本身不是协程,因此不能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)