Представьте, что у меня есть большое приложение CLI с множеством разных команд (подумайте, например, image-magick).
Я хотел организовать это приложение по модулям и т. Д. Итак, где-то был бы мастер click.group
:
#main.py file
@click.group()
def my_app():
pass
if __name__ == "__main__":
my_app()
которые можно импортировать в каждый модуль, определяющий команду:
from main import my_app
# command_x.py
@my_app.command()
def command_x():
pass
Проблема в том, что я сталкиваюсь с проблемой циклического импорта, поскольку файл main.py
ничего не знает о command_x.py
, и мне пришлось бы импортировать его перед вызовом основного раздела.
Это также происходит во Flask и обычно имеет дело с шаблоном фабрики приложений. Обычно приложение создается до просмотра:
app = Flask("my_app")
@my_app.route("/")
def view_x():
pass
if __name__ == "__main__":
app.run()
В шаблоне фабрики приложений вы откладываете «регистрацию» чертежей:
# blueprints.py
blueprint = Blueprint(yaddayadda)
@blueprint.route("/")
def view_x():
pass
И создайте фабрику, которая знает, как создавать приложение и регистрировать чертежи:
#app_factory.py
from blueprints import view_x
def create_app():
app = Flask()
view_x.init_app(app)
return app
Затем вы можете создать скрипт для запуска приложения:
#main.py
from app_factory import create_app
if __name__ == "__main__":
app = create_app()
app.run()
Можно ли использовать аналогичный узор с Click? Могу я просто создать «приложение для щелчков мышью» (возможно, расширяющее click.Group
), в котором я регистрирую «контроллеры», то есть отдельные команды?