Есть ли более идиоматический способ получить список аргументов с помощью Python Click?

Могу написать следующее:

import click


@click.command()
@click.option('--things', callback=lambda _,__,x: x.split(',') if x else [])
def fun(things):
    print('You gave me these things: {}'.format(things))


if __name__ == '__main__':
    fun()

Кажется, это работает, по крайней мере, если я сохраню его как fun.py, я смогу запустить:

$ python fun.py
You gave me these things: []
$ python fun.py --things penguins,knights,"something different"
You gave me these things: ['penguin', 'knights', 'something different']

Есть ли более идиоматический способ написать этот код с помощью Click, или это почти все?


person Wayne Werner    schedule 28.11.2016    source источник
comment
(предостережение, я не пользователь кликов, так что воспринимайте все, что я говорю, с большой долей скепсиса) -- Согласно документации, поддерживается только фиксированное количество аргументов. Так что я думаю, что эта стратегия довольно оптимальна. Очевидно, что если вы собираетесь использовать это часто, то хелпер с подходящим именем лучше, чем lambda. Вы также можете сделать multiple=True для поддержки python fun.py --thing penguin --thing knights ..., но это изменит структуру командной строки.   -  person mgilson    schedule 29.11.2016
comment
Я думал о том, чтобы использовать этот подход и каким-то образом разделить/объединить списки. Хотя не уверен, что мне это подойдет.   -  person Wayne Werner    schedule 29.11.2016
comment
Мне кажется, что этот ответ актуален и здесь. Компромисс заключается в том, что, поскольку он использует аргументы, click не будет автоматически форматировать --things в справке.   -  person ForeverWintr    schedule 10.12.2016


Ответы (1)


Я думаю, вам нужна «несколько» опций для параметров. Например.

import click

@click.command()
@click.option('--thing', multiple=True)
def fun(thing):
    print('You gave me these things: {}'.format(thing))

if __name__ == '__main__':
    fun()

А затем, чтобы передать несколько значений, вы указываете thing несколько раз. Вот так:

$ python fun.py
You gave me these things: ()

$ python fun.py --thing me
You gave me these things: ('me',)

$ python fun.py --thing penguins --thing knights --thing "something different"
You gave me these things: ('penguins', 'knights', 'something different')
person MinchinWeb    schedule 24.01.2017
comment
Это правильный ответ - person bfmcneill; 16.07.2021