2015-03-08 2 views
0

Я прочел similar question, заданный на SO, что не касается моей собственной проблемы. Для иллюстрации, скажем, у меня есть программа на Python с использованием argpase, который обеспечивает два подкомандами: copy и resume:Укажите подкоманду по умолчанию с позиционными аргументами

prog copy src dest # src, dest positional, required 
prog resume id  # id positional, required 

Однако наиболее естественный способ для вызова «копия» команда НЕ явно дают copy субкоманду , то есть, я надеялся:

prog src dest 

будет делать действие по умолчанию copy, в то же время сохранить преимущества имеют два subparsers, каждый обрабатывает другой набор аргументов. Возможно ли с пакетом argparse?

ответ

1

Формально нет. Аргумент подкоманды является обязательным позиционным аргументом, где «выбор» - это имена подпараметров (и их псевдонимы).

Это видно в справочном сообщении, были указаны как {cmd1,cmd}.

usage: ipython3 [-h] {cmd1,cmd2} ... 

positional arguments: 
    {cmd1,cmd2} 

optional arguments: 
    -h, --help show this help message and exit 

Последний Python имеет «ошибку», что на самом деле позволяет ему быть необязательным. Другими словами, это не вызывает ошибки, если вы не даете никаких позиций. Это ошибка, потому что она меняет предыдущее поведение, а большинство людей - то, что нужно. Но даже если это необязательно, и cmd1 определяется как значение по умолчанию, он не будет запускать парсер cmd1 по оставшимся аргументам. И любой аргумент «positional» будет считаться неправильной командной строкой.

Я думаю, что лучшее, что вы можете сделать, это определить один или несколько позиционеров. Возможно, у вас есть выбор и значение по умолчанию, и будет необязательным (nargs = '?'). Остальное (или другое) может иметь nargs='+'. Играя с этими параметрами, вы можете приблизиться к желаемому поведению, но он не будет использовать механизм подпараметров.


Другой способ думать о проблеме, чтобы рассмотреть вход как

prog one two 

Если это интерпретировать, что в prog src dest или prog cmd id. Единственным основанием для его высказывания должно быть то, что one не является одним из copy или resume. Но это не так уж умно, когда дело касается «выбора». Он присваивает значение, основанное на позиции, и затем проверяет, соответствует ли он критериям, таким как «выбор» или «тип» (т. Е. Целое число, строка float v).

+0

Хотя это не совсем то, на что я надеюсь, но я думаю, что он так же хорош, как и он. Спасибо, что нашли время, чтобы объяснить. – Oliver

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