partial asynchronous functions are not detected as asynchronous(不会将部分异步函数检测为异步函数)
本文介绍了不会将部分异步函数检测为异步函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有一个函数,它同时接受常规函数和异步函数(不是协同例程,而是返回协同例程的函数)。
在内部,它使用asyncio.iscoroutinefunction()
test查看它获得了哪种类型的函数。
最近,它在我尝试创建部分异步函数时出现故障。
在此演示中,ptest
未被识别为Couroute函数,即使它返回协程,即ptest()
是协程。
import asyncio
import functools
async def test(arg): pass
print(asyncio.iscoroutinefunction(test)) # True
ptest = functools.partial(test, None)
print(asyncio.iscoroutinefunction(ptest)) # False!!
print(asyncio.iscoroutine(ptest())) # True
问题原因明确,但解决方案不明确。
如何动态创建通过测试的部分异步函数?
或
如何测试包装在partial object中的函数?
任一答案都可以解决问题。
Python3.8版无法使partial()
对象通过该测试,因为该测试要求有一个__code__
对象直接附加到您传递给inspect.iscoroutinefunction()
的对象。inspect.iscoroutinefunction()
。__code__
__code__
__code__
推荐答案使用Python3.8版无法使partial()
对象通过该测试,因为该测试要求有一个对象直接附加到您传递给的对象
您应该测试partial
包装的函数对象,该对象可通过partial.func
attribute:
>>> asyncio.iscoroutinefunction(ptest.func)
True
如果您还需要测试partial()
对象,则针对functools.partial
进行测试:
def iscoroutinefunction_or_partial(object):
while isinstance(object, functools.partial):
object = object.func
return inspect.iscoroutinefunction(object)
在Python3.8(和更高版本)中,inspect
模块(asyncio.iscoroutinefunction()
委托给的)中的相关代码是updated to handle partial()
objects,您不再需要自己解开partial()
对象。该实现使用相同的while isinstance(..., functools.partial)
循环。
这篇关于不会将部分异步函数检测为异步函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:不会将部分异步函数检测为异步函数


猜你喜欢
- 分析异常:路径不存在:dbfs:/databricks/python/lib/python3.7/site-packages/sampleFolder/data; 2022-01-01
- padding='same' 转换为 PyTorch padding=# 2022-01-01
- 如何将一个类的函数分成多个文件? 2022-01-01
- python check_output 失败,退出状态为 1,但 Popen 适用于相同的命令 2022-01-01
- pytorch 中的自适应池是如何工作的? 2022-07-12
- 如何在 python3 中将 OrderedDict 转换为常规字典 2022-01-01
- 沿轴计算直方图 2022-01-01
- python-m http.server 443--使用SSL? 2022-01-01
- 使用Heroku上托管的Selenium登录Instagram时,找不到元素';用户名'; 2022-01-01
- 如何在 Python 的元组列表中对每个元组中的第一个值求和? 2022-01-01