Проблема с общим dest
. По умолчанию позиционный перезаписывает значение необязательного.
In [13]: p = argparse.ArgumentParser()
In [14]: a1 = p.add_argument('--foo')
In [15]: a2 = p.add_argument('bar', nargs='?', default='default')
In [16]: p.parse_args('xxx'.split())
Out[16]: Namespace(bar='xxx', foo=None)
In [17]: p.parse_args('--foo 1'.split())
Out[17]: Namespace(bar='default', foo='1')
Изменить, чтобы они разделяли dest
:
In [18]: a1.dest = 'bar'
Необязательный анализируется, затем позиционный. Так как это '?', Значение по умолчанию помещается в пространство имен, вместо записи предыдущего значения
In [19]: p.parse_args('--foo 1'.split())
Out[19]: Namespace(bar='default')
Здесь необязательное значение over записывает позиционное значение:
In [20]: p.parse_args('xxx --foo 1'.split())
Out[20]: Namespace(bar='1')
Здесь явное позиционное значение над записью опций:
In [21]: p.parse_args('--foo 1 xxx'.split())
Out[21]: Namespace(bar='xxx')
Я понимаю разницу тонкую. Это связано с тем, как анализируются позиционные и дополнительные функции (поочередно), а также с обработкой позиционного nargs='?'
.