2015-04-28 3 views
2

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

Есть ли способ настроить конфликтующие аргументы в модуле argparse? Я пробовал использовать метод add_mutually_exclusive_group, но это не то, что я ищу.

+0

Нет, argparse не поддерживает эту утилиту из коробки. Вы должны будете проверить это отдельно. –

+0

есть модуль, который может это сделать? – user3056783

+0

Не знаю, извините. –

ответ

3

Я предложил патч (или скорее исправления), который позволит вам протестировать общие логические комбинации аргументов. http://bugs.python.org/issue11588.

Ядро моих идей заключается в том, чтобы добавить крючок только внутри parse_args, который позволяет пользователю проверять все логические комбинации аргументов. При этом он указывает, что он имеет доступ к списку seen аргументов. Этот список недоступен для вас за пределами parse_args (отсюда и нужен крючок). Но с соответствующими defaults вы можете написать свои собственные тесты, которые используют пространство имен args.

Трудности с реализацией общей argparse версии включает в себя:

а) осуществление какого-то вложенность групп (в вашем случае несколько any групп гнездящихся в пределах xor группы)

б) отображением этих групп в значащий usage линия

На данный момент ваш лучший выбор - либо реализовать свою проблему с подпарщиками (если он подходит), либо провести собственное тестирование после разбора. И напишите свой собственный usage.

Вот эскиз обобщению тест, который может быть применен к args имен после разбора

def present(a): 
    # test whether an argument is 'present' or not 
    # simple case, just check whether it is the default None or not 
    if a is not None: 
     return True 
    else: 
     return False 

# sample namespace from parser 
args = argparse.Namespace(x1='one',x2=None,y1=None,y2=3) 

# a nested list defining the argument groups that need to be tested 
groups=[[args.x1,args.x2],[args.y1,args.y2]] 

# a test that applies 'any' test to the inner group 
# and returns the number of groups that are 'present' 
[any(present(a) for a in g) for g in groups].count(True) 

Если count является 0, ни одна из групп не найдены, если 1 одна группа была найдена, и т.д. hook, о котором я упоминал в проблеме с ошибкой, делает то же самое тестирование, просто используя другой тест present.

Обычный тест mutually exclusive будет возражать, если счет >1. Необходимая группа будет возражать 0 и т.д. Вы можете также сделать что-то вроде

if (present(args.x1) or present(args.x2)) and 
    (present(args.y1) or present(args.y2)): 
    parser.error('too many groups') 

то есть. некоторая комбинация из any, all, and, or. Но count - отличный способ справиться с состоянием xor.

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