Команды щелчка в отдельных файлах - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть скрипт 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говорит, что это не "как рекомендуется":

также может быть интересно объединить несколько в один скрипт.Хотя это, как правило, не так, как рекомендуется, поскольку он вкладывает один под другим, подход слияния может быть полезен в некоторых обстоятельствах для более приятного опыта оболочки.

Кто-нибудь знает, что подразумевается под "не так, как рекомендуется"так как он расположен один под другим ", какие могут быть возможные ошибки при таком подходе?

1 Ответ

0 голосов
/ 04 марта 2019

Загрузка команд клика из отдельных файлов

Из документов:

Нажмите в трех точках:

  • произвольное вложение команд

  • автоматическое создание страниц справки

  • поддерживает отложенную загрузку подкоманд во время выполнения

IПодумайте о третьем пункте (который считался достаточно важным для включения в этот короткий список), о том, как лучше всего делать то, что вы пытаетесь сделать.

Я склонен использовать click.CommandCollection только тогда, когда я не являюсьвладелец (не может легко редактировать) часть кода команды.Я думаю, что для варианта использования, который у вас есть, предпочтительным решением является использование click.MultiCommand.Описание из документов :

В дополнение к использованию click.group (), вы также можете создавать свои собственные мультикоманды.Это полезно, если вы хотите поддерживать команды, загружаемые лениво из плагинов.

Для этого есть простой пример использования в docs , здесь на SO и более сложный пример на GitHub , который описывается как:

complex - пример построения очень сложных приложений Cli, которые динамически загружают подкоманды из папки подключаемых модулей и т. д.вещи.

Если вам нужны причины, чтобы избежать CommandCollection, среди других проблем , есть существующая ошибка на github под названием: Добавление группы вCommandCollection теряет параметры группы .

Отвечая на ваш вопрос

Как указано в вопросе :

также может быть интересно объединить несколько в один скрипт.Хотя это, как правило, не так, как рекомендуется, так как он вкладывает один под другим, подход слияния может быть полезен в некоторых обстоятельствах для более приятного опыта оболочки.

Ваш вопрос:

Кто-нибудь знает, что подразумевается под "не так, как рекомендуется, так как он вкладывает один под другим" , что может быть несколько возможных ошибок для этого подхода.

Я думаю, что это переписатьможет сделать утверждение более ясным.

Хотя это, как правило, не так, как рекомендуется для размещения одного под другим , подход слияния может быть ...

Полагаю, именно это и пытались сказать.

...