测试函数或方法是正常的还是异步的

新手上路,请多包涵

如何确定函数或方法是普通函数还是异步函数?我希望我的代码自动支持正常或异步回调,并且需要一种方法来测试传递的函数类型。

 async def exampleAsyncCb():
    pass

def exampleNomralCb():
    pass

def isAsync(someFunc):
    #do cool dynamic python stuff on the function
    return True/False

async def callCallback(cb, arg):
    if isAsync(cb):
        await cb(arg)
    else:
        cb(arg)

根据传递的函数类型,它应该正常运行或等待。我尝试了各种方法,但不知道如何实施 isAsync()

原文由 Ecko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 426
2 个回答

使用 Python 的 检查 模块。

inspect.iscoroutinefunction(object)

如果对象是协程函数(使用 async def 语法定义的函数),则返回 true。

这个函数从 Python 3.5 开始可用。该模块可用于功能较少的 Python 2,当然没有您正在寻找的模块: 检查

顾名思义,检查模块对于检查很多东西很有用。文件说

inspect 模块提供了几个有用的函数来帮助获取有关活动对象的信息,例如模块、类、方法、函数、回溯、框架对象和代码对象。例如,它可以帮助您检查类的内容、检索方法的源代码、提取和格式化函数的参数列表,或者获取显示详细回溯所需的所有信息。

该模块主要提供四种服务:类型检查、获取源代码、检查类和函数以及检查解释器堆栈。

该模块的一些基本功能是:

 inspect.ismodule(object)
inspect.isclass(object)
inspect.ismethod(object)
inspect.isfunction(object)

它还包含检索源代码的功能

inspect.getdoc(object)
inspect.getcomments(object)
inspect.getfile(object)
inspect.getmodule(object)

方法的命名很直观。如果需要,可以在文档中找到说明。

原文由 Sharad 发布,翻译遵循 CC BY-SA 4.0 许可协议

如果您不想引入另一个导入 inspectiscoroutine 也可以在 asyncio 中使用。

 import asyncio

def isAsync(someFunc):
    return asyncio.iscoroutinefunction(someFunc)

原文由 dirn 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题