Зависимые параметры в docopt

#python #docopt

#python #docopt

Вопрос:

Мне было интересно, могу ли я иметь зависимые параметры в docopt.

пример:

 """
Description:
  Flash a system with the manufacturing software from the specifiedx folder.

Usage:
  flash_drop.py (--drop-dir=<DIR>) [--factory-reset=<BOOL>] [--flash-all=<BOOL>] [--flash-system1=<BOOL> | --flash-system2=<BOOL>]
  flash_drop.py -h | --help
  flash_drop.py --version

Options:
  -h --help                 Show this screen.
  --version                 Show version.
  --drop-dir=DIR            Path to the drop directory
  --factory-reset=BOOL          Factory reset the chips on all selected devices. [default: False]
  --flash-all=BOOL              Flash all devices. [default: False]
  --flash-system1=BOOL          Flash first system. [default: False]
  --flash-system2=BOOL          Flash second system. [default: False]
"""
  

А именно, значение параметра игнорируется, если предыдущий параметр не был выбран. Так, например, значение for --flash-system2 игнорируется, если --flash-system1 не установлено

Ответ №1:

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

 args['flash-system2'] = args['flash-system2'] if args['flash-system1'] else None
  

или

 if ('flash-system2' in args) and ('flash-system1' not in args):
    del args['flash-system2']
  

сразу после разбора аргументов

Комментарии:

1. Пока я делаю это так, но мне просто интересно, есть ли у docopt такая функциональность.

2. насколько я знаю, нет. функциональности как таковой нет. Однако было бы здорово, если бы мы могли сказать пользователю, что вы не можете указать flash-system2 , если flash-system1 не указано, без необходимости его записи.

Ответ №2:

Не с одним шаблоном использования, но вы можете сделать это с помощью 2 шаблонов:

 Usage:
  flash_drop.py (--drop-dir=<DIR>) [options] [--flash-system1=<BOOL>]
  flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL> --flash-system2=<BOOL>
  

Но, вероятно, лучше с тремя шаблонами, легче читать IMO:

 Usage:
  flash_drop.py (--drop-dir=<DIR>) [options]
  flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL>
  flash_drop.py (--drop-dir=<DIR>) [options] --flash-system1=<BOOL> --flash-system2=<BOOL>
  flash_drop.py -h | --help
  flash_drop.py --version
  

<a rel="noreferrer noopener nofollow" href="https:///try.docopt.org/?doc=Description:
Flash a system with the manufacturing software from the specifiedx folder.

Usage:
flash_drop.py (—drop-dir=) [options]
flash_drop.py (—drop-dir=) [options] —flash-system1=
flash_drop.py (—drop-dir=) [options] —flash-system1= —flash-system2=
flash_drop.py -h | —help
flash_drop.py —version

Options:
-h —help Show this screen.
—version Show version.
—drop-dir=DIR Path to the drop directory
—factory-reset=BOOL Factory reset the chips on all selected devices. [default: False]
—flash-all=BOOL Flash all devices. [default: False]
—flash-system1=BOOL Flash first system. [default: False]
—flash-system2=BOOL Flash second system. [default: False]amp;argv=—drop-dir=DDD —factory-reset=true —flash-system1=true —flash-system2=true» rel=»nofollow noreferrer»>Живая демонстрация


Постскриптум

Ну, технически вы можете сделать это с помощью одного шаблона, но он начинает становиться очень длинным…

 Usage:
  flash_drop.py (--drop-dir=<DIR>) [options] [(--flash-system1=<BOOL>) | (--flash-system1=<BOOL> --flash-system2=<BOOL>)]
  

Строки могут быть разорваны, поэтому, возможно:

 Usage:
  flash_drop.py (--drop-dir=<DIR>) [options] 
                [(--flash-system1=<BOOL>) | (--flash-system1=<BOOL> --flash-system2=<BOOL>)]
  

Лично я предпочитаю решение с 3 шаблонами.