Я пытаюсь создать приложение со следующим поведением:
myapp
- запустит приложение и сделает что-то А
myapp "some argument"
- сделал бы вещь B. На вещь B влияет аргумент "какой-то аргумент".
myapp command
— запустит «команду» (обозначается декоратором @cli.command
) с функцией C. На это будут влиять все, что может предложить щелчок, например @click.option
.
Обратите внимание, что в моем приложении будет больше команд, таких как C.
Я попытался реализовать это, используя этот код:
import click
class GroupWithOption(click.Group):
def list_commands(self, ctx):
return ['command']
def get_command(self, ctx, cmd_name):
if cmd_name == 'command':
return command
else:
return do_b
@click.group(cls=GroupWithOption, invoke_without_command=True)
def main():
print("Does A")
@main.command()
def command():
print("Does C")
@main.command()
def do_b():
print("Does B")
if __name__ == '__main__':
main()
Это имело смешанные результаты. Во-первых, я могу очень легко вызвать 3 разных поведения (или более), но я не смог понять, как передать аргумент команде B. Мне не нравится это решение. Оно не кажется чистым. И для правильной работы потребуется использование глобальных переменных и некоторые неприятные хаки.
Кто-нибудь из вас знает о лучшем способе, как это сделать?
if cmd_name == 'command': return command
? - person Stephen Rauch   schedule 27.02.2019get_command
действительно должен вернуть функцию, которая обрабатывает данную подкоманду. - person tomascapek   schedule 27.02.2019