При соблюдении официальной документации для обновления с optparse
до argparse
следующий простой парсер
import optparse
def parse_with_optparser(args):
opt_parser = optparse.OptionParser()
opt_parser.add_option('-a', action="store_true")
return opt_parser.parse_args(args)
становится:
def parse_with_argparser(args):
arg_parser = argparse.ArgumentParser()
arg_parser.add_argument('-a', action="store_true")
arg_parser.add_argument("sources", nargs='*')
return arg_parser.parse_args(args)
т.е.. добавлен дополнительный позиционный аргумент sources
.
Однако optparse
поддерживает перемежающиеся (или смешанные в argparse
-parlance) аргументы по умолчанию, то есть мы можем назвать успешными для
args = ['file1', '-a', 'file2']
parse_with_optparser(args)
# ({'a': True}, ['file1', 'file2'])
, но argparse
не поддерживает смешанные аргументы, и его использование приводит к ошибке:
parse_with_argparser(args)
# error: unrecognized arguments: file2
Начиная с Python3.7, существует parse_intermixed_args
(вместо parse_args
), который обрабатывает перемеженные / смешанные аргументы так же, как optparse
. Тем не менее, фреймворк нацелен на Python2.7 и Pyton> = 3.3, и поэтому использование parse_intermixed_args
не обрезает его.
Как перемежающиеся / смешанные аргументы должны обрабатываться в argparse
в версиях, предшествующих Python3.7?
Некоторые тестовые случаи:
Input Output
['file1', 'file2', '-a'] Namespace(a=True, sources=['file1', 'file2'])
['-a', 'file1', 'file2'] Namespace(a=True, sources=['file1', 'file2'])
['file1', '-a', 'file2'] Namespace(a=True, sources=['file1', 'file2'])
['file1', '-a', '-b'] error (-b is unknown option)