python asyncio.iscoroutinefunction和inspect.iscoroutinefunction 用法和区别

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