Я занимаюсь разработкой приложения интерфейса командной строки (CLI) на Python.Он состоит из точки входа cli.py , которая определяет синтаксический анализатор CLI, используя argparse .Существует также пакет command , который содержит несколько модулей, расширяющих синтаксический анализатор CLI с помощью соответствующих подкоманд
app
| cli.py
|____commands
| __init.py__
| sub_command1.py
| sub_command2.py
Мой первоначальный подход заключался в определении функции register_subcommand в каждом подкомандном модуле и вызовите каждый из них в cli.py .Поскольку это было немного многословно, и я хотел иметь возможность подключать подкоманду без изменения других файлов, я выбрал другой подход
В настоящее время я использую Pub-Sub для регистрации CLI для подкоманди призвать их.Преимущество заключается в том, что вы можете просто вставить субмодуль.Однако теперь импорт модулей выглядит странно, поскольку импорт не используется и предназначен только для побочных эффектов (регистрация подмодулей).
# cli.py (this is just a template, not working code)
import app.commands # unused import
parser = argparse.ArgumentParser()
publish_event('register_subcommand', parser)
args = parser.parse_args()
publish_event('execute_subcammnd', args)
# sub-command1.py
@subscribe('register_sub_modules')
def register_subcommand(parser):
pass
@subscribe('execute_subcammnd')
def execute_subcommand(args):
pass
# __init__.py
# Imports all sub_command modules in the package
Это плохая практика в Python в целом?Каковы недостатки?Есть ли лучший дизайн для достижения этой цели?