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.iscoroutinefunctionasyncio.iscoroutinefunction
支持 functools.partialFalseTrue(3.7及更早)
自定义装饰器FalseFalse
Python 3.8起区别简直一样一样

推荐:若仅仅判断 async def 的函数,大多用哪个都行。若希望对 partial 等某些历史情况兼容,用 asyncio.iscoroutinefunction 保险。


4. 官方文档


如仍有疑问可举具体例子说明你实际情况。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐