#python #python-3.x #optimization #nested #decorator
Вопрос:
Я создаю своего рода HTTP-фреймворк на Python. Я решил создать декоратор @http и определить методы, аргументы и т.д. В качестве аргументов декоратора.
Сначала это было хорошо, но на полпути я создал аргумент doc для автоматического создания документации. Вот мой код.
@http("GET", args=(
Argument("text", "string", maximum=32,
doc=Document(title="Input text.")),
Argument("count", "integer", minimum=1, maximum=100,
doc=Document(title="Multiple count."))),
require_auth=False,
doc=Document("Repeats the string specified with text.",
types="application/json",
responses=[
Response(200, "Successful response.", {
"success": True,
"result": "Hello, world!"
})
]))
def get(request): pass
Проблема, с которой я сталкиваюсь, заключается в том, что вложенность @http слишком глубока.
У кого-нибудь есть какие-либо идеи о том, как избежать этого гнездования?
Моя идея состоит в том, чтобы добавить больше декораторов, таких как @docs, но я не хочу использовать это изменение, потому что это значительно изменило бы внутреннее поведение.
Я использую переводчика, поэтому, если у вас есть какие-либо вопросы, пожалуйста, прокомментируйте, и я сделаю все возможное, чтобы ответить на них. Если у вас есть какие-либо вопросы или комментарии, пожалуйста, напишите мне.
Спасибо.
Комментарии:
1. Да, это действительно выглядит нежелательно. Вы можете либо использовать одну из уже доступных платформ документов (например, swagger), либо, если вы действительно хотите создать генератор документов самостоятельно, подумайте об использовании
Document
класса таким образом, чтобы вы могли наследовать от него и создавать классы документации с информацией, хранящейся в атрибутах.2. Спасибо вам за ваш комментарий. Тот, который я создаю, изначально был создан для облегчения создания HTTP API. Я уже создал один, который преобразует код Python в Swagger, и ранее использовал его, переопределяя такие методы, как get_doc(). Я не думал о способе наследования от класса Document. Спасибо за отличное предложение.