argparse необязательные аргументы

У меня есть следующий код в питоне:

group = parser.add_mutually_exclusive_group()
group.add_argument('-a', '--add', dest='name_to_add', help='Add a new group or a role to existing group')
group.add_argument('-u', '--upgrade', dest='name_to_upgrade', help='Upgrade a group with the new version')
group.add_argument('-r', '--remove', dest='name_to_remove', help='Remove a group')
group.add_argument('-l', '--list', dest="list_server_or_group_name", help='Get group or server state/configuration')

Моя проблема связана с опцией «-l». Я хочу иметь возможность перечислить конкретную группу и перечислить все группы. В настоящее время я делаю это с:

«python my_script.py -l имя_группы» — для вывода списка конкретной группы и «python my_script.py -l all» — для вывода списка всех групп.

Но я хотел бы перечислить все группы только с помощью: «python my_script.py -l». Как я должен изменить свой код, чтобы иметь возможность запускать его таким образом? и как я могу проверить это позже в коде?

Спасибо, Аршавский Александр.


person alexarsh    schedule 01.08.2012    source источник


Ответы (1)


Это невозможно с optparse.

Однако если вы переключитесь с optparse на argparse (начиная с 2.7 или 3.2), вы можете передать nargs='?':

'?'. Один аргумент будет получен из командной строки, если это возможно, и создан как один элемент. Если аргумент командной строки отсутствует, будет создано значение по умолчанию.

group.add_argument('-l', '--list', dest="list_server_or_group_name",
                   help='Get group or server state/configuration',
                   nargs='?', default=None, const='all')
person ecatmur    schedule 01.08.2012
comment
Спасибо за быстрый ответ. У меня почему-то не работает. После добавления этого и запуска с параметром -l args.list_server_or_group_name по какой-то причине имеет значение None, и я ожидаю, что это все - person alexarsh; 01.08.2012
comment
@alexarsh - Попробуйте также добавить ключевое слово const (например, const = 'all'). Наиболее поучительно, попробуйте простую программу, в которой вы добавляете аргумент как: grp.add_argument('-l',nargs='?',default=None,const='foo'), а затем проходите через различные варианты (вызов с -l, -l foo и без -l). - person mgilson; 01.08.2012