В настоящее время я пытаюсь настроить обработку ошибок, когда команда была дана без предоставления необходимых аргументов с помощью Click. В соответствии с этот вопрос SO это можно сделать, переопределив функцию show
click.exceptions.UsageError
. Однако я попытался изменить предоставленное там решение, но не смог заставить его работать.
В моем случае я хочу иметь возможность получить команду, которая должна быть выполнена (но не удалась из-за отсутствия аргументов) и в зависимости от введенной команды хочу продолжить обработку. Мой пример кода выглядит так:
@click.group(cls=MyGroup)
def myapp():
pass
@myapp.command()
@click.argument('myarg',type=str)
def mycommand(myarg: str) -> None:
do_stuff(myarg)
Поэтому, если команда была чем-то вроде myapp mycommand
и в ней отсутствуют необходимые аргументы, я хочу обработать ее индивидуально. Я искал какое-то время, но не смог понять, КАК получить команду (я пытался передать контекст, но, насколько я читал, UsageError
не получает никакого контекста при инициализации).
Буду признателен за любую подсказку или идею.
РЕДАКТИРОВАТЬ: реализация myGroup
выглядит так:
class myGroup(click.Group):
"""
Customize help order and get_command
https://stackoverflow.com/a/47984810/713980
"""
def __init__(self, *args, **kwargs):
self.help_priorities = {}
super(myGroup, self).__init__(*args, **kwargs)
def get_help(self, ctx):
self.list_commands = self.list_commands_for_help
return super(myGroup, self).get_help(ctx)
def list_commands_for_help(self, ctx):
"""reorder the list of commands when listing the help"""
commands = super(myGroup, self).list_commands(ctx)
return (c[1] for c in sorted((self.help_priorities.get(command, 1000), command) for command in commands))
def command(self, *args, **kwargs):
"""Behaves the same as `click.Group.command()` except capture
a priority for listing command names in help.
"""
help_priority = kwargs.pop('help_priority', 1000)
help_priorities = self.help_priorities
def decorator(f):
cmd = super(myGroup, self).command(*args, **kwargs)(f)
help_priorities[cmd.name] = help_priority
return cmd
return decorator
def get_command(self, ctx, cmd_name):
rv = click.Group.get_command(self, ctx, cmd_name)
if rv is not None:
return rv
sim_commands = most_sim_com(cmd_name, COMMANDS)
matches = [cmd for cmd in self.list_commands(ctx) if cmd in sim_commands]
if not matches:
ctx.fail(click.style('Unknown command and no similar command was found!', fg='red'))
elif len(matches) == 1:
click.echo(click.style(f'Unknown command! Will use best match {matches[0]}.', fg='red'))
return click.Group.get_command(self, ctx, matches[0])
ctx.fail(click.style(f'Unknown command. Most similar commands were {", ".join(sorted(matches))}', fg='red'))
MyGroup
, пожалуйста? - person afterburner   schedule 28.04.2020myarg
не передается в ваш вызов команды? - person afterburner   schedule 28.04.2020