2015-08-21 2 views
1

При использовании argparse, мне нужно убедиться, что пользователь вводит две строки. Однако есть два возможных варианта для ввода строк в, например. варианты -a и -b. Они должны быть в состоянии сделать любое из следующих действий:Как проверить общее количество переданных аргументов?

python runscript.py -a str1 str2 
python runscript.py -a str1 -b str2 
python runscript.py -b str1 str2 

Ключ должен быть только два входа, но они могут быть в любой из доступных вариантов.

Моя попытка в основном устанавливает аргументы как этот

parser.add_argument('-a', nargs='*') 
parser.add_argument('-b', nargs='*') 

Тогда я должен сделать это:

if (args.a): num_a = len(args.a) # I need to check if the -a option was even used 
else: num_a = 0 

if (args.b): num_b = len(args.b) # same as above but for -b option 
else: num_b = 0 

# Check that number of arguments is correct 
if (num_a + num_b) != 2: 
    <error code> 

Это кажется немного постороннее. Есть ли более питонический способ сделать это?

+0

Какой смысл делать ' -a' и '-b', что вы не можете просто определить два позиционных аргумента (или один позиционный аргумент с' nargs = 2')? – chepner

+0

Так или иначе вы должны суммировать длину аргументов. Ничто в 'argparse' не сделает это за вас. – hpaulj

+0

@chepner Я уверен, что есть много случаев, когда вам это может понадобиться, но для моего случая: я хочу, чтобы пользователь вводил два имени файла для сравнения. Мне нужно, чтобы они также указывали, какие файлы они вводят, поскольку расширение имени файла может быть произвольным. Таким образом, нет никакого способа узнать, какой файл пользователь явно не говорит мне, используя параметры. Затем, в зависимости от того, какой вариант файла они выбирают, я разбираю файл по-разному. то есть есть два типа файлов, которые содержат подобную информацию, но отформатированы по-разному, и мне нужно знать, какой способ проанализировать любой тип файла. – supernun

ответ

4

Дайте оба аргумента по умолчанию пустое значение списка:

parser.add_argument('-a', nargs='*', default=[]) 
parser.add_argument('-b', nargs='*', default=[]) 

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

if len(args.a) + len(args.b) != 2: 
    parser.error('....')