代码之家  ›  专栏  ›  技术社区  ›  VPfB

部分异步函数未检测为异步函数

  •  0
  • VPfB  · 技术社区  · 7 年前

    我有一个同时接受常规和异步函数的函数(不是协程,而是返回协程的函数)。

    内部使用 asyncio.iscoroutinefunction() test 看看它有什么功能。

    在这次演示中, ptest 不是 被识别为coutroutine函数,即使它返回一个协程,即。 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

    任何一个答案都能解决问题。

    1 回复  |  直到 7 年前
        1
  •  15
  •   Martijn Pieters    6 年前

    使用Python版本<3.8你不能 partial() __code__ 直接附着到传递对象的对象 inspect.iscoroutinefunction() .

    partial partial.func attribute :

    >>> asyncio.iscoroutinefunction(ptest.func)
    True
    

    对象,然后测试 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 ,你就不用再拆开了 反对你自己。实现使用相同的 while isinstance(..., functools.partial) 循环。

        2
  •  0
  •   serg06    5 年前

    partial 具有 async_partial :

    def async_partial(f, *args):
       async def f2(*args2):
           result = f(*args, *args2)
           if asyncio.iscoroutinefunction(f):
               result = await result
           return result
    
       return f2