Установите выбор по умолчанию для optionparser, когда опция задана

У меня есть парсеры параметров Python, которые анализируют необязательный параметр --list-что-то. Я также хочу, чтобы опция --list-что-то имела необязательный аргумент (опция)

Используя аргумент default="simple" здесь не работает, иначе просто всегда будет по умолчанию, а не только когда был задан --list-что-то.

from optparse import OptionParser, OptionGroup
parser = OptionParser()
options = OptionGroup(parser, "options")
options.add_option("--list-something",
                   type="choice",
                   choices=["simple", "detailed"],
                   help="show list of available things"
                  )
parser.add_option_group(options)
opts, args = parser.parse_args()
print opts, args

Код выше производит это:

[jens@ca60c173 ~]$ python main.py --list-something simple
{'list_something': 'simple'} []
[jens@ca60c173 ~]$ python main.py --list-something 
Usage: main.py [options]

main.py: error: --list-something option requires an argument
[jens@ca60c173 ~]$ python main.py 
{'list_something': None} []

Но я хочу, чтобы это случилось

[jens@ca60c173 ~]$ python main.py --list-something simple
{'list_something': 'simple'} []
[jens@ca60c173 ~]$ python main.py --list-something 
{'list_something': 'simple'} []
[jens@ca60c173 ~]$ python main.py 
{'list_something': None} []

Я хотел бы что-то, что работает из коробки в Python 2.4 до 3.0 (3.0 не входит в комплект)

Поскольку argparse введен только в Python 2.7, я не могу это использовать.

2 ответа

Решение

Optparse не имеет возможности сделать это легко. Вместо этого вам придется создать собственный обратный вызов для вашего варианта. Обратный вызов срабатывает, когда ваша опция анализируется, и в этот момент вы можете проверить оставшиеся аргументы, чтобы убедиться, что пользователь поставил аргумент для этой опции.

Ознакомьтесь с пользовательским разделом обратного вызова документов, в частности пример обратного вызова 6: переменные аргументы.

Для Optparser по умолчанию в Python нет значения по умолчанию.
Тем не менее, вы можете использовать следующие -

# show help as default
if len(sys.argv) == 1:
  os.system(sys.argv[0] + " -h")
  exit()

Это запустит тот же скрипт с -h вариант и выход.
пожалуйста, обратите внимание - вам нужно будет импортировать модуль sys.

Другие вопросы по тегам