По умолчанию stdin
для потенциально пустого списка файлов, вы можете определить пользовательский класс аргумента, например:
Пользовательский класс:
class FilesDefaultToStdin(click.Argument):
def __init__(self, *args, **kwargs):
kwargs['nargs'] = -1
kwargs['type'] = click.File('r')
super().__init__(*args, **kwargs)
def full_process_value(self, ctx, value):
return super().process_value(ctx, value or ('-', ))
Определение этого поведения как классаобеспечивает простое повторное использование.
Для использования пользовательского класса:
@click.command()
@click.argument("logs", cls=FilesDefaultToStdin)
def main(logs):
...
Как это работает?
Это работает, потому что click - это хорошо разработанная OO-структура.Декоратор @click.argument()
обычно создает экземпляр объекта click.Argument
, но позволяет переопределить это поведение параметром cls
.Так что относительно легко унаследовать от click.Argument
в нашем собственном классе и переопределить нужные методы.
В этом случае мы переопределяем click.Argument.full_process_value()
.В нашем full_process_value()
мы ищем пустой список аргументов, и если он пустой, мы добавляем в список аргумент -
(stdin).
Кроме того, мы автоматически назначаем nargs=-1
и type=click.File('r')
аргументов.