Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Передать аргумент в декоратор

#python #декоратор


Привет!

Мне нужно передать простой аргумент(строку) в декоратор. Не понимаю, как это сделать.

def timing(function):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        time_start = timer()
        ret = function(*args, **kwargs)
        spent_time = round(timer() - time_start, 5)

        return ret, spent_time
    return wrapper


Пытался так:

def timing(function, string=''):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        time_start = timer()
        ret = function(*args, **kwargs)
        spent_time = round(timer() - time_start, 5)
        print string
        return ret, spent_time
    return wrapper


И вызывать так:

 @timing(string='getting statement')
    def check_statement(self):
        if bool(self.state):
            return


Вылетает с ошибкой:

@timing(message='')
TypeError: timing() takes exactly 2 arguments (1 given)


Пытался завернуть в еще один декоратор:

def timing(function, message):
    def clock(message):
        @functools.wraps(function)
        def wrapper(*args, **kwargs):
            time_start = timer()
            ret = function(*args, **kwargs)
            spent_time = round(timer() - time_start, 5)

        return wrapper# ret, spent_time
    return clock


Traceback:

    @timing(message='')
TypeError: timing() takes exactly 2 arguments (1 given)


Помогите пожалуйста сделать правильно
    


Ответы

Ответ 1



Вот: def decorator(s): def wrap(function): def called(*args, **kwargs): print(s, function, args, kwargs) return function(*args, **kwargs) return called return wrap @decorator('example') def f(num): print(num) f(1)

Ответ 2



Можно использовать functools.partial при указании декоратора у функции: @functools.partial(timing, string='getting statement') def check_statement(self): if bool(self.state): return

Ответ 3



def add_decor(func, add): def wrap(*args, **kwargs): return func(*args, **kwargs) + add return wrap def summ_(a, b=0): return a + b add_decor(summ_, add=100)(1, b=1) # 102 summ_add = add_decor(summ_, add=10) summ_add(1, b=1) # 12

Комментариев нет:

Отправить комментарий