Я предложил патч (или скорее исправления), который позволит вам протестировать общие логические комбинации аргументов. 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
.
Нет, argparse не поддерживает эту утилиту из коробки. Вы должны будете проверить это отдельно. –
есть модуль, который может это сделать? – user3056783
Не знаю, извините. –