Python, декоратор запоминает аргументы прошлого вызова

Рейтинг: 0Ответов: 0Опубликовано: 26.05.2023

Есть следующий декоратор:

def foreign_key_instance_exists(database_model, foreign_field: str):
    def _inner_wrapper(func):
        def _wrapper(*args, **kwargs):
            print(foreign_field)
            try:
                foreign_id = dict(args[0])[foreign_field]
            except TypeError:
                foreign_id = dict(args[1])[foreign_field]

            if not database_model.get_or_none(database_model.id == foreign_id):
                return DATABASE.INSTANCE.INSTANCE_NOT_EXISTS

            return func(*args, **kwargs)
        return _wrapper
    return _inner_wrapper

Изначально, в коде он появляется тут

@foreign_key_instance_exists(RequestType, 'request_type')
def create(new_request: pydantic_models.Request):
    try:
        new_instance = Request.create(
            request_type=new_request.request_type,
            verify=new_request.verify
        )

        new_instance.save()

    except peewee.DoesNotExist:
        return DATABASE.REQUEST.REQUEST_TYPE_DOES_NOT_EXISTS

    return get(new_instance.id)

Но позже, я пытаюсь его использовать повторно

@foreign_key_instance_exists(User, "user")
@foreign_key_instance_exists(Sector, "sector")
def create(new_employee: pydantic_models.Employee):
    try:
        new_instance = Employee.create(
            last_name=new_employee.last_name,
            first_name=new_employee.first_name,
            partonymic=new_employee.patronymic,
            user=new_employee.user,
            sector=new_employee.sector
        )

        new_instance.save()

    except IntegrityError:
        return DATABASE.USER.USER_EXISTS

    return get(new_instance.id)

При попытке использования метода create из employee, получаю ошибку

127.0.0.1 - - [26/May/2023 02:23:15] "POST /api/employee/create?api_token=1 HTTP/1.1" 500 -
Traceback (most recent call last):
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 2213, in __call__
    return self.wsgi_app(environ, start_response)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 2193, in wsgi_app
    response = self.handle_exception(e)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 2190, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 1486, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 1484, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask\app.py", line 1469, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\keeperprowebservice\lib\site-packages\flask_pydantic\core.py", line 251, in wrapper
    res = func(*args, **kwargs)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\src\api\service.py", line 26, in check_token
    return func(*args, **kwargs)
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\src\api\routers\employee.py", line 32, in create
    return flask.jsonify(request.create(body))
  File "C:\Users\Navnica\Desktop\KeeperPROWebService\src\api\service.py", line 49, in _wrapper
    foreign_id = dict(args[0])[foreign_field]
KeyError: 'request_type'

Пытался поменять в первом использовании request_type на "что-угодно", к примеру request_typeee, в результате получил ту же самую ошибку, но только с KeyError: 'request_typeee'. В чём заключается ошибка? Почему декоратор запомнил первое использование? И как это решить?

Ответы

Ответов пока нет.