У меня есть скрипт Python 3.6, который использует последний пакет click.У меня много команд, поэтому я бы хотел перенести некоторые в отдельные модули.Например,
main.py: root, with commands A and B as children
mylib1.py: commands C and D
mylib2.py: commands E and F
, затем в main
я хочу "импортировать" C в F так, чтобы в main были все 6 команд, т.е. все 6 являются дочерними для root.
Грубая сила - это много обслуживания:
# mylib1.py
@click.command()
def cmd1():
...
...
@click.command()
def cmdN():
...
# main.py
import click
from mylib1 import cmd1, cmd2, ... cmdN
@click.group()
def main(): pass
@main.command()
def main_cmd1(): pass
main.add_command(cmd1)
...
main.add_command(cmdN)
Немного меньше обслуживания (не нужно управлять импортом):
# mylib1.py
def add_commands(group):
group.add_command(cmd1)
...
group.add_command(cmdN)
# main.py
import click, mylib
@click.group()
def main(): pass
@main.command()
def main_cmd1(): pass
mylib1.add_commands(main)
main()
Но, похоже, наиболее приемлемым являетсяиспользуйте click.CommandCollection
, что позволяет мне сделать так, как будто команды в одной группе фактически находятся в другой:
# mylib1.py
import click
@click.group()
def commands():
pass
@commands.command()
def cmd1():
...
...
@commands.command()
def cmdN():
...
# main.py
import click, mylib1
@click.group()
def main_group(): pass
@main_group.command()
def main_cmd1(): pass
main = click.CommandCollection([main_group, mylib1.commands])
main()
Кажется, это работает хорошо и пока проблем нет, но документация для CommandCollection
говорит, что это не "как рекомендуется":
также может быть интересно объединить несколько в один скрипт.Хотя это, как правило, не так, как рекомендуется, поскольку он вкладывает один под другим, подход слияния может быть полезен в некоторых обстоятельствах для более приятного опыта оболочки.
Кто-нибудь знает, что подразумевается под "не так, как рекомендуется"так как он расположен один под другим ", какие могут быть возможные ошибки при таком подходе?