#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 шаблонами.