частичные асинхронные функции не определяются как асинхронные - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть функция, которая принимает как обычные, так и асинхронные функции (не сопрограммы, а функции, возвращающие сопрограммы).

Внутренне она использует asyncio.iscoroutinefunction() test , чтобы увидеть, какой тип функции онаgot.

Недавно он сломался, когда я попытался создать частичную асинхронную функцию.

В этой демонстрации ptest не распознается как функция обхода, дажеесли он возвращает сопрограмму, т.е. 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

Причина проблемы ясна, но решение - нет.

Как динамическисоздать частичную асинхронную функцию, которая проходит тест?

ИЛИ

Как проверить функцию, обернутую в частичный объект ?

Любой ответ решитпроблема.

1 Ответ

0 голосов
/ 20 сентября 2018

Вы не можете заставить объект partial() пройти этот тест, потому что для теста требуется, чтобы объект __code__ был прикреплен непосредственно к объекту, который вы передаете inspect.iscoroutinefunction().

Вместо этого вам следуетпроверить функциональный объект, который partial оборачивает, доступный через атрибут [partial.func [[https://docs.python.org/3/library/functools.html#functools.partial.func):

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

. Если вам также необходимо проверить на partial() объекты, то проверьте на functools.partial:

def iscoroutinefunction_or_partial(object):
    if isinstance(object, functools.partial):
        object = object.func
    return inspect.iscoroutinefunction(object)
...