Объедините аргументы и параметры нескольких команд Click в одну команду CLI - PullRequest
0 голосов
/ 27 февраля 2020

Есть ли способ сгруппировать несколько команд, каждая из которых имеет свои собственные параметры в рамках одной функции.

На первый взгляд, MultiCommand или Group может показаться естественным способом выполнения того, что Я хотел бы, то есть иметь единственную основную команду, действующую как Group (и передавать флаг invoke_without_command=True), затем вкладывать вспомогательные Command под ним в качестве подкоманд. Однако это не совсем то поведение, которое мне хотелось бы, поскольку мне бы хотелось, чтобы все параметры всех команд можно было указывать без явного вызова подкоманды. Кроме того, использование Group также не отображало бы текст справки подкоманд без вызова подкоманды в командной строке.

Я думаю, что в идеале хотелось бы иметь способ группировать несколько команды вместе, без вложенности, присущей Click Group API.

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

Вот краткое описание того, что я хотел бы (имя файла: cli_test.py):

import click


@click.command()
@click.option('--db-file', type=click.File(mode='r'))
def db_reader(db_file):
    click.echo(db_file)


@click.command()
@click.option('--xval', type=float)
@click.option('--yval', type=float)
def get_vals(xval, yval):
    return xval, yval


@click.command()
@click.option('--absolutize/--no-absolutize')
def flagger(absolutize):
    click.echo(absolutize)


@click.command()
def cli_runner():
    db = db_reader.main(standalone_mode=False)
    vals = flagger.main(standalone_mode=False)
    flag = flagger.main(standalone_mode=False)


if __name__ == '__main__':
    cli_runner()

По сути, я бы хотел одну команду, которая может быть запущена на CLI (cli_runner в приведенном выше примере), которая сможет принимать параметры всех команд Click, вызываемых в нем, а затем отправлять обработку их в соответствующий Command экземпляр. Однако, как сейчас, если бы я вызвал на CLI: $ python cli_test.py --xval 4 я бы получил ошибку Error: no such option: --xval. Я также попытался поиграться с подходом pass_context, а затем ctx.invoke(), но та же проблема существует.

Полагаю, я мог бы передавать параметры из всех содержащихся команд в cli_runner, но это победило бы цель того, что я хочу сделать, - это в конечном итоге иметь 3-4 модульных «подкоманды», которые затем могут быть сгруппированы вместе в различных комбинациях в более крупные интерфейсы, которые обслуживают несколько разные варианты использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...