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