Как проверить, является ли функция асин c функцией из класса - PullRequest
0 голосов
/ 23 марта 2020

У меня есть следующий фрагмент кода:

import asyncio

class Test:
    def __init__(self):
        print(asyncio.iscoroutinefunction(self.func2))
        # The following block of code does not identify func2 as an async function
        for i in dir(self):
            if not i.startswith('__'):  # To eliminate inclusion of dunder functions
                print(i, asyncio.iscoroutinefunction(i))

    def func1(self):
        pass

    async def func2(self):
        pass


Test()

Когда я пытаюсь проверить, является ли функция асинхронной c, используя имя класса, связанное с именем функции, она работает как положено и возвращает False для func1 True для func2, что ожидается.

Но когда я пытаюсь сделать то же самое без использования имени класса, связанного с функцией (см. код в блоке for) с помощью dir () для себя и l oop через каждую функцию одну за другой и проверьте, являются ли они асинхронными c или нет, он не работает должным образом и возвращает False для func1, что ожидается, но также для func2 не ожидаемый и неправильный.

Результаты:

True
func1 False
func2 False

Tl; dr: Как я могу l oop просмотреть все функции, доступные в классе, и проверить, являются ли они асинхронными c или нет

1 Ответ

2 голосов
/ 23 марта 2020

dir() возвращает список имен методов, в основном список строк.

Чтобы получить реальные методы, вы можете использовать функцию inspect.getmembers().
Ваш l oop должен выглядеть так:

for name, method in inspect.getmembers(self, predicate=inspect.ismethod):
    if not name.startswith('__'):  # To eliminate inclusion of dunder functions
        print(name, asyncio.iscoroutinefunction(method))
...