Я пытаюсь создать python программу, которая имеет сложный анализатор аргументов. программа (пусть называется MyProg) должна работать следующим образом:
1-MyProg будет принимать некоторые файлы в качестве входных данных, поэтому я использовал флаг -f в главном анализаторе (это уже subparser, поэтому я не могу использовать subparser).
2 - программа имеет 2 аргумента ( -a и -s ), которые должны присутствовать вместе, и один из них требуется, поэтому я использовал группу взаимоисключения.
3- -a должен иметь аргумент -k , поэтому я поставил - k один в нормальной группе внутри группы взаимного исключения, я сделал 2-й шаг и сделал его ( -k ) обязательным аргументом.
4 - проблема в том, что -s аргументу нужен либо -k , либо другой - e аргумент (не оба), поэтому я не знаю, где поставить этот -e аргумент, поэтому не может быть с -a или с -k .
с кодом:
description = "Prog"
# Initialize parser
parser = argparse.ArgumentParser(description=description,)
subparsers = parser.add_subparsers(required=True)
parser_MyProg = subparsers.add_parser('MyProg')
group_mut = parser_MyProg.add_mutually_exclusive_group()
group_k = group_mut.add_argument_group()
group_mut.add_argument('-a', type=int)
group_k.add_argument('-k', '--key', required=True, type=type=argparse.FileType('r'))
group_mut.add_argument('-s', type=int,)
group_mut.add_argument('-e',type=int)
parser_MyProg.add_argument( '-f', nargs='+', type=type=argparse.FileType('r'))
# некоторые действительные варианты использования (должны быть действительными)
args = parser.parse_args(
'MyProg -a 8 -k k.txt -f file1.txt file2.txt '.split())
args = parser.parse_args(
'MyProg -s 8 -k k.txt -f file1.txt file2.txt '.split())
args = parser.parse_args(
'MyProg -s 8 -e 5 -f file1.txt file2.txt '.split())
# некоторые недопустимые варианты использования (не должно быть действительным)
args = parser.parse_args('MyProg -a 8 -f file1.txt file2.txt '.split()) #need a -k
args = parser.parse_args('MyProg -s 8 -f file1.txt file2.txt '.split()) #need a -k or -e
args = parser.parse_args('MyProg -s 8 -e 5 -k k.txt -f file1.txt file2.txt '.split()) # -k and -e can't be present together
в приведенном выше коде я использовал -e в группе взаимного исключения, но это до сих пор работает, потому что: 1 - я не могу использовать его с -s 2 - я могу использовать его с -k 3 - аргумент -k требуется даже с аргументом -s (с -s я хочу либо -e , либо -k , но не оба )
Я немного упростил код, чтобы вы могли увидеть проблему. Программа представляет собой программу шифрования, дешифрования и хеширования, но я просто хотел прояснить, поэтому я немного ее упростил.