Создайте декоратор, который будет проверять, выполнится ли функция успешно или выкинет ошибку?
Мне нужно создать декоратор для события в django и сохранить все args, kwargs, status, etc в модели django. Пока что я могу хранить args, kwargs и traceback, но проблема в том, что событие может завершиться неудачей, поэтому мне нужно сохранить и статус, т.е. успех или неудачу. Как мне это сделать с помощью декоратора?
import inspect
import traceback
def dump_args(func):
def wrapper(*args, **kwargs):
func_args = inspect.signature(func).bind(*args, **kwargs).arguments
func_args_str = ", ".join(map("{0[0]} = {0[1]!r}".format, func_args.items()))
print(f"{func.__module__}.{func.__qualname__} ( {func_args_str} )")
return func(*args, **kwargs)
return wrapper
@dump_args
def test(event, profile=None, loan_request=None, approved_loan=None,
loan_tranche=None, lead=None, limit_revision=None,
event_kwargs=None, use_atomic=False):
try:
#some event will run
pass
except:
#if event fails
var = traceback.format_exc()
print(var)
test(1, 2, 3, 4, 5, d=6, g=12.9)
Теперь я хочу узнать, как можно получить status = Success, если функция выполняется успешно, и status = Fail, если она не работает?
Может быть, что-то вроде этого было бы разумно, если бы было общим.
import inspect
import traceback
def dump_args(func, event):
def wrapper(*args, **kwargs):
try:
func_args = inspect.signature(func).bind(*args, **kwargs).arguments
func_args_str = ", ".join(map("{0[0]} = {0[1]!r}".format, func_args.items()))
print(f"{func.__module__}.{func.__qualname__} ( {func_args_str} )")
func_res = func(*args, **kwargs)
event.success()
except:
var = traceback.format_exc()
event.fail(var)
print(var)
finally:
return func_res
return wrapper
@dump_args
def test(event, profile=None, loan_request=None, approved_loan=None,
loan_tranche=None, lead=None, limit_revision=None,
event_kwargs=None, use_atomic=False):
do_something_that_fails()
test(1, 2, 3, 4, 5, d=6, g=12.9)