optparse (): проверка ввода - PullRequest
3 голосов
/ 12 июля 2011

Заранее прошу прощения, если где-то уже ответили;Я был на сайте Python с прошлого часа.но не совсем понял, как я могу это сделать.Мой сценарий должен принимать следующие параметры:

myScript.py -f <file-name> -e [/ -d]
myScript.py -s <string> -e [/ -d]
myScript.py -f <file-name> [/ -s <string>] -e -w [<file_name>]

т.е. -f / -s, -e / -d являются обязательными параметрами, но -f & -s нельзя использовать вместе итак же, как с опциями -e & -d - нельзя использовать вместе.Как я могу поставить чек на место?

Еще один вопрос, если я могу спросить одновременно: Как я могу использовать опцию -w (при использовании) со значением или без значения?Если значение не указано, оно должно принимать значение по умолчанию, в противном случае - указанное значение.Любая помощь с благодарностью.Ура !!

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Прошло много времени с тех пор, как я что-то сделал с optparse, но я кратко рассмотрел документы и старую программу.

" -f / -s,-e / -d являются обязательными параметрами, но -f & -s нельзя использовать вместе, и то же самое, что и с параметрами -e & -d - нельзя использовать вместе. Как я могу поставить чек на место?"

Для взаимной исключительности вы должны выполнить проверку самостоятельно, например:

parser.add_option("-e", help="e desc", dest="e_opt", action="store_true")
parser.add_option("-d", help="d desc", dest="d_opt", action="store_true")
(opts, args) = parser.parse_args()
if (parser.has_option("-e") and parser.has_option("-d")):
    print "Error!  Found both d and e options.  You can't do that!"
    sys.exit(1)

Поскольку здесь приведены варианты логических параметров, вы можете заменить строку if выше на:

if (opts.e_opt and opts.d_opt):

Подробнее см. В разделе Как optparse обрабатывает ошибки .

" Как использовать параметр -w (если используется) со значением или w / oa? "

Я никогда не искал способ иметь опцию optparse, для которой значение, ну, в общем, необязательно.AFAIK, вы должны установить опцию, чтобы иметь значения или не иметь значения.Самое близкое, что я пришел, - это указать значение по умолчанию для опции, которая должна иметь значение.Тогда эту запись не нужно указывать в командной строке.Пример кода:

parser.add_option("-w", help="warning", dest="warn", default=0)

Кроме того, с (надеюсь, полезным) предложением:

Если вы видели документы, вы увидели часть о том, что «обязательные опции» - оксюморон, верно?;-p Кроме юмора, вы можете рассмотреть возможность перепроектирования интерфейса, чтобы:

  • Необходимая информация не вводилась с использованием «опции».
  • Только один аргумент(или группа аргументов) вводит данные, которые могут быть взаимоисключающими.Другими словами, вместо «-e» или «-d» используйте «-e on» или «-e off».Если вы хотите что-то вроде «-v» для подробного и «-q» для тихого / подробного отключения, вы можете сохранить значения в одной переменной:
parser.add_option("-v", help="verbose on", dest="verbose", action="store_true")
parser.add_option("-q", help="verbose off", dest="verbose", action="store_false")

Этот конкретный пример заимствован (снебольшое расширение) из секции Обработка логических (флаговых) опций .Для чего-то подобного вы также можете проверить раздел Опции группировки ;Я не использовал эту функцию, поэтому не буду больше о ней говорить.

2 голосов
/ 12 июля 2011

Вы должны попробовать с argparse, если вы используете 2.7+. Этот раздел должен быть тем, что вы хотите.

Tl; др:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')

делает --foo и --bar взаимоисключающими. См. Подробное использование argparse для получения дополнительной информации об использовании ArgumentParser s

Помните, что optparse устарела, поэтому использование argparse в любом случае является хорошей идеей.

...