Получить список сопрограмм в текущем файле - PullRequest
1 голос
/ 28 апреля 2020

Я хочу получить список всех сопрограмм в текущем файле (extern_method и extern_method2 в моем примере кода). Поведение должно быть таким же, как: method_list = [extern_method, extern_method2], но я хочу, чтобы оно отображалось автоматически.

У меня есть такая файловая структура:

@wraps(lambda: extern_method)
@my_decorator
async def extern_method(arg)
return arg + "hello"

@wraps(lambda: extern_method2)
@my_decorator
async def extern_method2(arg)
return arg + 123

class myclass:
    (...)
    def find_extern_methods():
        #here missing code
        return method_list
    (...)
    def do_sth_with_methods():
        #do sth. with Methods

Я пытался использовать ast Модуль:

with open(basename(__file__), "rb") as f:
    g = ast.parse(f.read(), basename(__file__))
    for e in g.body:
        if isinstance(e, ast.AsyncFuntionDef):
            method_list.append(e)

Это может найти все сопрограммы, но я не могу извлечь какую-либо ссылку на него.

Я также пытался использовать,

method_list = inspect.getmembers(basename(__file__), inspect.iscoroutinefunction))

но это тоже ничего не найдет.

1 Ответ

1 голос
/ 06 мая 2020

Итак, я нашел способ найти сопрограммы самого текущего файла:

my_module_coros = inspect.getmembers(modules[__name__]), inspect.iscoroutinefunction)

coro_list = [coro[1] for coro in my_module_coros if (inspect.getmodule(coro[1]) == modules[__name__]) and coro[0] != "main"]

Это вернет список сопрограмм без самого main.

...