检测使用异步def创建的任何函数

时间:2019-07-10 12:25:19

标签: python python-3.6 python-asyncio python-3.7 coroutine

我对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中出现,但仍令人困惑。

1 个答案:

答案 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)