Позиционер с nargs='?'
имеет некоторую специальную обработку по умолчанию (здесь None
).
Обычно значения по умолчанию назначаются пространству имен в начале синтаксического анализа и перезаписываются такими действиями, как необязательный.
Поскольку пустой список значений удовлетворяет nargs
, этот позиционный объект всегда «виден». Но вместо того, чтобы назначать []
или какую-либо другую пустую строку, анализатор назначает значение по умолчанию. Таким образом, по умолчанию позиционное значение перезаписывает значение, установленное в '-a'.
nargs='*'
получает такую же специальную обработку.
Я подозреваю, что если у вас был другой позиционный аргумент перед '- а ', что вы не увидите этот эффект. Позиционал '? *' Будет обработан перед '-a' и не перезапишет его значение.
Необязательные параметры обрабатываются только при наличии флага. Позиционирование всегда обрабатывается независимо от nargs
. «Дополнительные» позиционеры обрабатываются, но с некоторой дополнительной обработкой значений по умолчанию. Но когда они обрабатываются относительно помеченных аргументов, они могут различаться.
Это хитрое поведение, о котором я знаю просто потому, что подробно изучил код и ответил на множество вопросов здесь и на * 1024. * ошибка / проблемы.
Совместное использование dest
часто работает, но это больше по умолчанию, чем дизайн. Это результат других вариантов дизайна. argparse
не дает никаких обещаний в этом отношении. Так что, если это ненадежно, не используйте его.