Click: Как настроить обработку ошибок «Ошибка: нет такой команды xx» с помощью Click? - PullRequest
1 голос
/ 25 апреля 2020

У меня есть приложение Click, над которым я работаю, и я хочу настроить (переопределить) поведение Click по умолчанию, когда была вызвана команда / подкоманда, которая не известна.

В настоящее время существует только это сообщение об ошибке: Error: No such command xx и после этого код больше не выполняется.

Моя первоначальная установка выглядит следующим образом:

@click.group(cls=CustomHelpOrder)
@click.option('-v', '--verbose',is_flag=True)
def myapp_cli(verbose):
    if verbose:
         do_verbose()
    else:
         do_not_verbose()


@myapp_cli.command(help_priority=1, short_help='Foo my project')
@click.option('--bar')
def baz(bar: str) -> None:
    """
    Do something

    """
    do_something(bar)

Так что я хочу иметь возможность сделать это :

  • Проверьте, возникает ли это (специальное) исключение выше. (Возможно, если пользователь введет bat вместо baz)
  • Если да, я хочу сохранить эту неизвестную команду (например, bat (вместо того, чтобы просто печатать сообщение по умолчанию и выйти) и использовать ее для дальнейшей обработки (например, передача ее различным функциям (возможно, в виде строки))

Я пытался try: myapp_cli() except Click.Exception: handleExc(), но я не смог выяснить, как это сделать, поскольку приложение просто завершается, если команда неизвестна (я думаю, прежде чем что-то сможет ее поймать; действительно наивный подход). Мне интересно, нужно ли как-то перезаписывать поведение по умолчанию, но, поскольку я новичок в Click, я не знаю, как.

Буду благодарен за любую помощь.

1 Ответ

1 голос
/ 25 апреля 2020

Привет, Фарвент и добро пожаловать!

Вы можете создать свою собственную группу. Из Руководство по клику :


class AliasedGroup(click.Group):

    def get_command(self, ctx, cmd_name):
        rv = click.Group.get_command(self, ctx, cmd_name)
        if rv is not None:
            return rv
        matches = [x for x in self.list_commands(ctx)
                   if x.startswith(cmd_name)]
        if not matches:
            return None
        elif len(matches) == 1:
            return click.Group.get_command(self, ctx, matches[0])
        ctx.fail('Too many matches: %s' % ', '.join(sorted(matches)))

В приведенном выше фрагменте вы можете отредактировать следующую часть для обработки вашего Command not found случая, как вам будет.

if not matches:
    # your custom logic for `Command not found` goes here

Надеюсь, это поможет!

...