Если вы хотите, чтобы -f был обязательным, вы можете сделать это с помощью argparse . Просто включите «required = True» внутри функции add_argument.
Помните, что обязательная опция противоречива. Не рекомендуется делать необходимые параметры, но иногда полезно. Если опция не указана, то место назначения остается значением None (или ему присваивается любое заданное по умолчанию значение, которое в вашем примере - None).
РЕДАКТИРОВАТЬ: Только что увидел ваши изменения, и я понимаю, что вы сейчас спрашиваете. optparse делает это проще IMO. Похоже, для позиционных аргументов с 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
Обычно, если задан параметр файла, он перезаписывает позиционный аргумент.