python asyncio.iscoroutinefunction和inspect.iscoroutinefunction 用法和区别
·
python asyncio.iscoroutinefunction和inspect.iscoroutinefunction 用法和区别
这两个都是用来判断一个函数是不是异步协程函数(coroutine function),但是有细微区别。
1. 基本用法
inspect.iscoroutinefunction
import inspect
async def foo(): pass
print(inspect.iscoroutinefunction(foo)) # True
print(inspect.iscoroutinefunction(lambda: 123)) # False
- 功能:判断对象是否是由
async def定义的协程函数。
asyncio.iscoroutinefunction
import asyncio
async def foo(): pass
print(asyncio.iscoroutinefunction(foo)) # True
- 功能:用于判断对象是否为协程函数。
- 注意:它会特别考虑
functools.partial()、装饰器等包裹的协程函数。 - 其实在Python 3.8以后,
asyncio.iscoroutinefunction直接就是inspect.iscoroutinefunction的别名了,但早期版本有特殊包装。
2. 区别
主要区别
inspect.iscoroutinefunction只判断函数本身是不是用async def定义的。asyncio.iscoroutinefunction还会特别考虑被部分装饰器/partial包装过的异步函数。(主要是早期Python版本)
举例说明
functools.partial
import functools
import inspect
import asyncio
async def foo(): pass
pf = functools.partial(foo)
print(inspect.iscoroutinefunction(pf)) # False
print(asyncio.iscoroutinefunction(pf)) # True (Python 3.7及更早)
- 在 Python 3.8 之后,两者行为趋同,但有历史兼容性。
被自定义装饰器装饰
def deco(f):
def wrapper(*a, **k):
return f(*a, **k)
return wrapper
@deco
async def foo():
pass
import inspect, asyncio
print(inspect.iscoroutinefunction(foo)) # False
print(asyncio.iscoroutinefunction(foo)) # False(两者都检测不出)
- 被改变签名的装饰器包裹后都会检测不到。
3. 总结
| inspect.iscoroutinefunction | asyncio.iscoroutinefunction | |
|---|---|---|
| 支持 functools.partial | False | True(3.7及更早) |
| 自定义装饰器 | False | False |
| Python 3.8起区别 | 简直一样 | 一样 |
推荐:若仅仅判断 async def 的函数,大多用哪个都行。若希望对 partial 等某些历史情况兼容,用 asyncio.iscoroutinefunction 保险。
4. 官方文档
inspect.iscoroutinefunctionasyncio.iscoroutinefunction(注意文档说明3.8后是别名!)
如仍有疑问可举具体例子说明你实际情况。
更多推荐


所有评论(0)