Совместное использование подкоманды среди нескольких команд верхнего уровня - PullRequest
1 голос
/ 11 июня 2019

У меня есть проект Python с несколькими точками входа верхнего уровня, назовем их foo и bar.Обе точки входа используют одну и ту же кодовую базу, и я хочу реализовать команду foo version и bar version, используя точно такой же код, реализующий команду version().

Итак, в foo.py яскажу

import click

@click.group()
def foo():

@foo.command
@option('--long', ...)
@option('--check', ...)
def version(long, check):
    ...

То же самое в bar.Как я могу избежать дублирования определений команд в обоих файлах?

1 Ответ

1 голос
/ 11 июня 2019

Ссылка на этот ответ вы можете создать команду щелчка и добавить ее в несколько групп или команд в виде двух отдельных операций.

Создание команды щелчка:

Сначала нам нужно создать команду щелчка. Мы будем использовать вспомогательную функцию для декорирования импортируемой команды, например:

import click

def importable_command(*args, **kwargs):
    def decorator(f):
        return click.decorators.command(*args, **kwargs)(f)
    return decorator


@importable_command('version')
@click.option('--long')
@click.option('--check')
def version_cmd(long, check):
    click.echo('version long: {}'.format(long))
    click.echo('version check: {}'.format(check))

Добавить команду в группу:

Затем мы можем импортировать команду и добавить ее в группу с помощью:

from where-ever-we-defined-it import version_cmd

# Add our version command to this group
a_group.add_command(version_cmd)

Тестовый код:

import click

def importable_command(*args, **kwargs):
    def decorator(f):
        return click.decorators.command(*args, **kwargs)(f)
    return decorator


@importable_command('version')
@click.option('--long')
@click.option('--check')
def version_cmd(long, check):
    click.echo('version long: {}'.format(long))
    click.echo('version check: {}'.format(check))


@click.group()
def cli():
    """An Awesome CLI"""


# Add our version command to this group
cli.add_command(version_cmd)

if __name__ == "__main__":
    commands = (
        'version --long a_long',
        'version --help',
        '--help',
    )

    import sys, time

    time.sleep(1)
    print('Click Version: {}'.format(click.__version__))
    print('Python Version: {}'.format(sys.version))
    for cmd in commands:
        try:
            time.sleep(0.1)
            print('-----------')
            print('> ' + cmd)
            time.sleep(0.1)
            cli(cmd.split())

        except BaseException as exc:
            if str(exc) != '0' and \
                    not isinstance(exc, (click.ClickException, SystemExit)):
                raise

Результаты:

Click Version: 6.7
Python Version: 3.6.3 (v3.6.3:2c5fed8, Oct  3 2017, 18:11:49) [MSC v.1900 64 bit (AMD64)]
-----------
> version --long a_long
version long: a_long
version check: None
-----------
> version --help
Usage: test.py version [OPTIONS]

Options:
  --long TEXT
  --check TEXT
  --help        Show this message and exit.
-----------
> --help
Usage: test.py [OPTIONS] COMMAND [ARGS]...

  An Awesome CLI

Options:
  --help  Show this message and exit.

Commands:
  version
...