Создайте декоратор, который будет проверять, выполнится ли функция успешно или выкинет ошибку?

Мне нужно создать декоратор для события в 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)
Вернуться на верх