Параметры#

Click поддерживает два вида параметров: опции и аргументы. В click аргументы имеют больше ограничений.

Возможности доступные только в опциях:

  • запрос ввода значения опции у пользователя

  • опции могут использоваться как флаги

  • значения опций можно считывать из переменных окружения с автоматическим префиксом

  • опциям можно писать help

Возможности доступные только в аргументах:

  • передача любого количества значений

Типы параметров#

По умолчанию тип параметра будет строкой str, но его можно задавать явно или получать косвенно с помощью значения по умолчанию.

Доступные типы (большинство типов показаны в примерах опций):

  • базовые типы: str, int, float, bool

  • click.File - специальный тип, который автоматически открывает и закрывает файл. Возвращает открытый файл

  • click.Path - тип для проверки пути, файл это или каталог и подобного. Возвращает строку, не открытый файл

  • click.Choice - набор допустимых значений

  • click.IntRange - диапазон числовых значений

  • click.DateTime - преобразует строку с датой в объект datetime

Базовые типы: str, int, float, bool#

Если указать, что тип параметра int или float, click будет проверять, что скрипту как аргумент передается именно этот тип данных. Например:

@click.command()
@click.argument("ip_address")
@click.option("--count", "-c", type=int, help="Number of packets")
def main(ip_address, count):
    pass

При вызове скрипта, опция -c ожидает значение типа int:

$ python example_03_ping_ip_list_progress_bar.py 8.8.8.8 -c test
Usage: example_03_ping_ip_list_progress_bar.py [OPTIONS] IP_ADDRESS
Try 'example_03_ping_ip_list_progress_bar.py --help' for help.

Error: Invalid value for '--count' / '-c': test is not a valid integer

click.File#

Тип click.File

class click.File(mode='r', encoding=None, errors='strict', lazy=None, atomic=False)

Этот тип используется для работы с файлами. Особенность типа clicl.File в том, что файл автоматически открывается и закрывается click. Файл может быть открыт для чтения или записи, плюс специальное значение - указывает, что вместо файла надо открыть stdin/stdout.

Пример аргумента с типом click.File:

@click.command()
@click.argument("connection_params", type=click.File("r"))
def cli(connection_params):
    devices = yaml.safe_load(connection_params)

Так как click открывает файл, внутри функции cli connection_params это уже открытый файл.

click.Path#

Тип click.Path

class click.Path(exists=False, file_okay=True, dir_okay=True, writable=False, readable=True, resolve_path=False, allow_dash=False, path_type=None)

Пример аргумента с типом click.Path:

@click.command()
@click.argument("source", type=click.Path(exists=True))
def cli(source):
    pass
$ python script.py sh_cdp_n_r22.txt
Usage: script.py SOURCE DESTINATION
Try 'script.py --help' for help.

Error: Invalid value for 'SOURCE': Path 'sh_cdp_n_r22.txt' does not exist.

click.Choice#

Тип click.Choice позволяет указать допустимые варианты значений для параметра:

@click.command()
@click.option("--key", "-k", type=click.Choice(["mac", "ip", "vlan"]))
def cli(key):
    pass

Если при вызове скрипта передать другое значение, возникнет ошибка:

$ python example_choice.py --key test
...
Error: Invalid value for '--key' / '-k': invalid choice: test. (choose from mac, ip, vlan)

click.IntRange#

Тип click.IntRange:

class click.IntRange(min=None, max=None, clamp=False)

Пример использования:

@click.command()
@click.option("--threads", "-t", type=click.IntRange(1, 10))
def cli(threads):
    pass

Если указанное значение не попадает в диапазон, по умолчанию возникнет ошибка. Если установить clamp=True, вместо ошибки, значение будет подгоняться под ближайшую границу. Например, если в примере выше передать 20, то threads будет равен 10.