декоратор python оберните другим декоратором и измените аргументы функций

#python #flask #python-decorators #flask-restx

Вопрос:

Я использую flask-restx для своих API.
(а) @namespace.expect(schema) декоратор создает автоматическую документацию,
(б) и RequestParser анализирует ввод запроса

вот код, который хорошо работает и достигает (а) и (б):

 ns = api.namespace('my-api')

@ns.route('/my/api')
class MyApi(Resource):
    schema = read_schema(schema_name)
    @ns.expect(self.schema_model(schema_name, schema), validate=True)
    def post(self):
        parser = RequestParser()
        parser.add_argument('aaa', type=inputs.datetime_from_iso8601)
        parser.add_argument('bbb', type=int)
        parser.parse_args()
        do_something(args['aaa'], args['bbb'])
 

Чтобы предотвратить написание синтаксического анализатора для каждого api, я решил расширить flask_restx.Namespace класс и добавить свой собственный декоратор, который будет:
(a) добавьте @expect декоратор в функцию
(b) создайте синтаксический анализатор из схемы и добавьте проанализированные аргументы в post функцию

вот реализация класса:

 from flask_restx import Namespace

class RestNamespace(Namespace):

    def schema(self, schema_name, parse=False):
        schema_name = schema_name
        schema = get_api_schema(schema_name)
        parser = build_parser(schema)

        def decorator(f):
            @functools.wraps(f)
            def wrapper(*args, **kwargs):
                if parse:
                    req_args = parser.parse_args()
                    return f(*args, req_args, **kwargs)

                return f(*args, **kwargs)

            return wrapper

        return self.expect(self.schema_model(schema_name, schema), validate=True)(decorator)

# -- usage -----:

ns = RestNamespace('my-api', api=api)

@ns.route('/my/api')
class MyApi(Resource):
    @ns.schema(schema_name, parse=True)
    def post(self, args):
        do_something(args['aaa'], args['bbb'])
 

к сожалению, когда я это делаю, возврат self.expect(..) в декораторе не дает результатов (документ не отображается), синтаксический анализ (функция оболочки) работает хорошо

если я заменю
return self.expect(self.schema_model(schema_name, schema), validate=True)(decorator)
с
return self.expect(self.schema_model(schema_name, schema), validate=True)
затем документ действительно появляется, но внутренняя оболочка, которая выполняет синтаксический анализ, не имеет никакого эффекта

Как правильно в одном декораторе обернуть данную функцию другим декоратором и изменить аргументы функций?