@cherish5

Python декоратор, итератор, как зарегистрировать функцию?

Суть задачи: есть функция summator (или, может быть, любая другая с произвольным кол-ом аргументов). Необходимо обернуть в декоратор, который зарегистрирует ее в списке функций объекта Caller. В последствии, нужно итерировать и "исполнить" все зарегистрированные функции.
У меня сложности, видимо ошибка в декораторе и в методе app_func(им хочу регистрировать функции в объекте), нужно как-то добавить в список именно функции и уже из __next их вызывать. Если есть идеи, помогите, где искать?
class Caller:

    def __init__(self, *args, **kwargs):
        self.arg1 = args
        self.arg2 = kwargs
        self.list_func = []
        self.count_list = 0

    def __iter__(self):
        return self

    def __next__(self):
       
        if len(self.list_func) > self.count_list:
            res = self.list_func[self.count_list]
            self.count_list += 1
            return res
        else:
            raise StopIteration

    def app_func(self, func):
        self.list_func.append(func(*self.arg1, **self.arg2))


def register_function(caller0):
    def my_decorator(func):
        def wrapper(*args, **kwargs):
            
            return caller0.app_func(func(*args, **kwargs))
        return wrapper
    return my_decorator


caller1 = Caller(1, 2, z=5)  # создаем один объект Caller'а, который хранит в себе числовые аргументы

@register_function(caller1)  # регистрируем функцию в обоих объектах
def summator(x, y, z):  # сама функция просто возвращает сумму аргументов
    return x + y + z

for result in caller1:  # теперь будем лениво вызывать функции, зарегистрированные
    print(result)  # в caller1, выводя их результаты на экран
  • Вопрос задан
  • 104 просмотра
Решения вопроса 1
не много поправил ваш код
class Caller:

    def __init__(self, *args, **kwargs):
        self.list_func = []
        self.args = args
        self.kwargs = kwargs

    def __iter__(self):
        for func in self.list_func:
            yield f'{func.__name__}: {func(*self.args, **self.kwargs)}'

    def app_func(self, func):
        self.list_func.append(func)


def register_function(caller0):
    def my_decorator(func):
        caller0.app_func(func)

    return my_decorator


caller1 = Caller(1, 2, z=5)  # создаем один объект Caller'а, который хранит в себе числовые аргументы


@register_function(caller1)  # регистрируем функцию в обоих объектах
def summator(x, y, z):  # сама функция просто возвращает сумму аргументов
    return x + y + z


@register_function(caller1)  # регистрируем функцию в обоих объектах
def func_2(x, y, z):  # сама функция просто возвращает сумму аргументов
    return x * y * z


for result in caller1:  # теперь будем лениво вызывать функции, зарегистрированные
    print(result)


summator: 8
func_2: 10
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы