Python: как обрабатывать исключения из argparse?

1

Я хотел бы использовать свою программу следующим образом:

pythonScript -f имя файла

Но если я забыл -f, я все равно хочу получить имя файла.

Поэтому я хочу, чтобы это "имя файла pythonScript" также работало (-> я могу получить имя файла из args.fileName или обработать исключение)

Я знаю, что это должно быть легко, я просто не могу найти способ сделать это. Кто-нибудь может мне помочь? благодаря

import argparse
parser = argparse.ArgumentParser(prog='PROG')
parser.add_argument('-f', action='store', dest='fileName',
    default = None, type=str, help='The file name')

try:
    args = parser.parse_args()
except:
    print "xxx"
  • 0
    Это ожидаемо и хорошо. -* это флаг, а опция - не обязательна. Кроме того, вы никогда не заявляли, что это необходимо, наоборот, вы даже указали значение по умолчанию.
  • 0
    о, я имею в виду, что я все еще хочу получить имя файла, если я забыл -f. извините за путаницу
Теги:
argparse

1 ответ

3
Лучший ответ

Если вы хотите, чтобы -f требовался, вы можете сделать это с помощью argparse. Просто включите "required = True" внутри функции add_argument.

Помните, что требуемый вариант противоречив. Это не предлагалось делать необходимые параметры, но иногда полезно. Если опция не указана, то пункт назначения остается значением None (или ему присваивается любое значение по умолчанию, которое вы указали, что в вашем примере отсутствует None).

EDIT: Просто увидел ваше редактирование, и я понимаю, что вы просите сейчас. optparse делает эту более простую ИМО. Кажется, что для позиционных аргументов с argparse вам нужно использовать add_argument.

На самом деле нет простого способа заставить argparse сделать это за вас. Вы можете имитировать его немного творчески следующим образом:

parser = argparse.ArgumentParser()
parser.add_argument('file', nargs='?')
parser.add_argument('-f', dest='file_opt')
args = parser.parse_args()
if args.file_opt:
    args.file = args.file_opt

В принципе, если есть опция файла, она перезаписывает позиционный аргумент.

  • 0
    спасибо, но на самом деле я хочу, чтобы -f был необязательным, см. мой обновленный вопрос
  • 0
    Спасибо, это работает

Ещё вопросы

Сообщество Overcoder
Наверх
Меню