为什么不将一个函数声明为类型类型的异步.CoroutineType?

时间:2016-01-17 16:39:23

标签: python python-3.x async-await

引自here

  

types.CoroutineType

     

协同对象的类型,由异步def函数创建。

引自here

  

使用async def语法定义的函数始终是协程函数,即使它们不包含await或async关键字。

Python控制台会话:

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  6 2015, 01:38:48) [MSC v.1900 32
bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import types
>>> def f(): pass
...
>>> async def g(): pass
...
>>> isinstance(f, types.FunctionType)
True
>>> isinstance(g, types.FunctionType)
True
>>> isinstance(g, types.CoroutineType)
False
>>>

为什么不isinstance(g, types.CoroutineType)评估为True

2 个答案:

答案 0 :(得分:4)

协同程序和协同程序功能之间存在差异。与发电机和发电机功能之间存在差异的方式相同:

调用函数g会返回一个协程,例如:

>>> isinstance(g(), types.CoroutineType)
True

如果您需要判断g是否是协程函数(即返回协程),您可以查看:

>>> from asyncio import iscoroutinefunction
>>> iscoroutinefunction(g)
True

答案 1 :(得分:1)

当使用这种方式时,

isinstance(g, types.CoroutineType) 本身不是有效的Coroutine函数:

g()

这类似于发电机和发电机功能之间的差异。相反,请使用isinstance(g(), types.CoroutineType) 进行比较:

iscoroutinefunction(g)

你也可以试试from asyncio import iscoroutinefunction iscoroutinefunction(g) #Return true ,更短更整洁:

{{1}}

在此处阅读更多内容:https://docs.python.org/3/library/asyncio-task.html