gedev
@gedev
сисадмин-энтузиаст

Как добавить глобальные опции в Python Click?

Суть — пишу сложный CLI с множеством субкоманд (местами до 4-х уровней). У утилиты есть конфиг в формате TOML, где по секциям пользователь может разложить разные токены. Соответственно у приложения есть две глобальные опции:
  • --config FILE
  • --profile PROFILE_NAME

Хочу добиться чтобы работал следующий синтаксис (с вариациями):
  1. $ command.py --profile xxx --config yyy cmd1 cmd2
  2. $ command.py cmd1 cmd2 --profile xxx --config yyy
  3. $ command.py --profile xxx cmd1 cmd2 --config yyy

Нужно, чтобы опции были доступны последней субкоманде (cmd2) и на уровне самой команды command.py. Пока получилось реализовать вариант номер 1. Я попробовал добавить опции и к субкоманде, но получается какая-то ерунда.

Вот мой код:
spoiler
import click
import functools


class RuntimeConfig:
    """Runtime configuration class. Set `config_file` and `profile`."""

    def __init__(self, config_file: str = None, profile: str = None):
        self.config_file = config_file or "config.conf"
        self.profile = profile or "default"


pass_rconfig = click.make_pass_decorator(RuntimeConfig, ensure=True)


def common_options(f):
    options = [
        click.option( "--config", "-c", "config_file", default=None),
        click.option("--profile", "-p", type=str, default=None),
    ]
    return functools.reduce(lambda x, opt: opt(x), options, f)


@click.group()
@common_options
@click.pass_context
def cli(ctx, config_file, profile):
    ctx.obj = RuntimeConfig(config_file, profile)


@cli.group("cmd1")
def cmd1():
    pass


@cmd1.command("cmd2")
@common_options
@pass_rconfig
def cmd2(ctx, config_file, profile):
    print("--config from context:", ctx.config_file)
    print("--profile from context:", ctx.profile)
    print("--config:", config_file)
    print("--profile:", profile)


if __name__ == "__main__":
    cli()

Вопрос сводится к тому как перезаписать опции, которые заданы в контексте (объект ctx) в cmd2? Сейчас получаю два набора опций, что совсем не то, что надо.
  • Вопрос задан
  • 87 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы