Python argparse: аргумент командной строки, который может быть как именованным, так и позиционным

Я пытаюсь сделать программу на Python, которая используетargparse модуль для разбора параметров командной строки.

Я хочу сделать необязательный аргумент, который может быть именованным или позиционным. Например, я хочуmyScript --username=batman сделать то же самое, что иmyScript batman, Я также хочуmyScript без имени пользователя, чтобы быть действительным. Это возможно? Если так, как это можно сделать?

Я пробовал разные вещи, похожие на код ниже, но безуспешно.

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin")
group.add_argument("user-name", default="admin")
args = parser.parse_args()

РЕДАКТИРОВАТЬ: Код выше выдает исключение, сказавValueError: mutually exclusive arguments must be optional.

Я использую Python 2.7.2 на OS X 10.8.4.

РЕДАКТИРОВАТЬЯ попробовал предложение Габриэля Якобсона, но не смог заставить его работать правильно во всех случаях.

Я попробовал это:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-u", "--user-name", default="admin", nargs="?")
group.add_argument("user_name", default="admin", nargs="?")
args = parser.parse_args()
print(args)

и работаетmyScript batman будет печататьNamespace(user_name='batman'), ноmyScript -u batman а такжеmyScript --user-name=batman будет печататьNamespace(user_name='admin').

Я пытался изменить имяuser-name вuser_name в 1-мadd_argument линия, и это иногда приводило как кbatman а такжеadmin в пространстве имен или ошибка, в зависимости от того, как я запустил программу.

Я пытался изменить имяuser_name вuser-name во второмadd_argument линия, но это напечатало бы либоNamespace(user-name='batman', user_name='admin') или жеNamespace(user-name='admin', user_name='batman')в зависимости от того, как я запустил программу.

Ответы на вопрос(3)

Ваш ответ на вопрос