2017-01-30 7 views
0

У меня есть сценарий, который имеет несколько вариантов использования в зависимости от аргументов, которые он получает. Например, если вызвано:argparse для условно необязательного аргумента

script.py 

он выполнит свою основную функцию. Но я также хочу, чтобы иметь возможность запускать другие функции:

script.py -a 

перейдет в интерактивный режим.

script.py -r -f filename.txt 

Следует использовать файл, чтобы перезапустить полку.

script.py -e -f filename.txt 

Следует использовать этот файл для расширения полки.

Моя проблема в том, что я хочу, чтобы флаг -f был необязательным, если не присутствуют флаги -r или -e .

Мой текущий код:

parser = argparse.ArgumentParser() 
group = parser.add_mutually_exclusive_group() 
group.add_argument("-a", action="store_true") 
group.add_argument("-r", action="store_true") 
group.add_argument("-e", action="store_true") 

Теперь я не знаю, как флаг -f вписывается в Я использую Python 3.5..

+0

Хорошо. Теперь я вижу, что мне действительно не нужен флаг -f. Я могу сделать флаги -r и -e хранить аргумент файла вместо булевых флагов. Но я хотел бы знать, есть ли способ иметь флаг, только если требуется другое. – user24312

ответ

1

Если добавить

parser.add_argument('-f','--file',help='filename') 

тогда команда -f filename будет принята во все времена и присутствовать в пространстве имен, как, например,

Namespace(file='filename', a=False, r=True, e=False) 

если опустить, вы увидите file=None.

Один из вариантов заключается в том, чтобы просто использовать эту добавленную информацию при ее предоставлении и необходимости и игнорировать, если она вам не нужна. Вы также можете дать ему полезное значение default (для случаев, когда пользователи не дают вам имя).

Другая возможность состоит в том, чтобы определить, как -r

group.add_argument ('- г', помощь = 'режим г имя_файла')

Тогда вместо args.r не будучи True/False, это будет `None /'имя файла'.

Возможно, вам потребуется уточнить, что означает, что для filename необязательно. Когда это вариант, требуется и/или запрещено.

Вы также мог бы пойти subparsers маршрут и определить -f аргумент для r и «х» subparsers, но не «а» один.

Обратите внимание на то, как выглядит использование/помощь. Подумайте о том, как вы хотите проинструктировать своего пользователя относительно правильного использования. Не делайте это слишком сложным.

+0

Спасибо за ваш ответ. Мое требование состоит в том, чтобы файл требовался только тогда, когда присутствуют флаг -r или -e.В зависимости от флага файл будет использоваться по-разному. Вы сказали о методе «subparser», можете ли вы привести пример того, как я могу это сделать? – user24312

+0

И если они используют флаг -a? Можно ли указать имя файла, или вы хотите его заблокировать? Что касается подпараметров, начните с документов. Не существует «взаимоисключающей» группировки. – hpaulj

Смежные вопросы