Вы можете ограничить возможные значения параметром choices
.И сделайте это необязательным с '?'nargs
:
parser=argparse.ArgumentParser()
parser.add_argument('foo',choices=['abc','def'],nargs='?')
parser.add_argument('-d') # flagged options
args = parser.parse_args()
print(args)
Позиционирование может происходить в любом порядке относительно опционов.
Использование более чем одного позиционирования, где "?" Немного сложнее, см.: Python argparse, Значение после позиционного аргумента
Для большего контроля над тем, какой необязательный параметр разрешен с этими позиционными значениями, посмотрите на механизм подпарсеров.Но для начала попробуйте эту простую версию.
Тест с:
print(parser.parse_args([])) # no input, ok
print(parser.parse_args(['-d', '1', 'abc'] # ok
parser_parse_args(['adf']) # error