#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
Комментариев нет:
Отправить комментарий