2012-07-03 8 views
12

Я хотел бы иметь следующий синтаксис:Python: argparse необязательных аргументов без дефисов

python utility.py file1 FILE1 file2 FILE2 

где file1 и file2 необязательные аргументы. Это просто, чтобы сделать его работать с этим синтаксисом:

python utility.py --file1 FILE1 --file2 FILE2 

использованием

parser.add_argument('--file1',type=file) 
parser.add_argument('--file2',type=file) 

однако, если я удалю черточки, argparse начинает интерпретируют это как позиционную, а не необязательный аргумент ...

Другими словами, можно ли конкретно указать argparse, является ли аргумент необязательным или позиционным, чтобы у меня были необязательные параметры без тире?

+2

Этот синтаксис (без тире) не сбивает с толку, как ад! Существует причина, по которой существует конвенция. –

+1

@MartijnPieters: это может сбивать с толку, но для некоторых научных приложений это стандарт ... [пример] (http://www.ccp4.ac.uk/html/refmac5/description.html) – jvm

+1

@MartijnPieters: counterexample: интерфейс командной строки 'git' или' svn'. –

ответ

4

Чтобы получить argparse, для этого вам не нужно. Тем не менее, вы можете сделать argparse принимать любое количество позиционных аргументов:

parser.add_argument('FILES',nargs='*') 
options=parser.parse_args() 
file1,optional_files=options.FILES[0],options.FILES[1:] 

Конечно, вы можете захотеть добавить некоторые проверки, чтобы убедиться, что по крайней мере один файл был дан, и т.д.

EDIT

Я все еще не 100% уверен, что вы хотите, но если file1 и file2 являются символьные строки, вы можете работать вокруг, что немного по предварительной обработки sys.argv. Конечно, это все равно будет форматировать сообщение справки странно, но вы всегда можете добавить эпилог объяснить, что либо форма OK:

import argparse 
import sys 

mangle_args=('file1','file2') 
arguments=['--'+arg if arg in mangle_args else arg for arg in sys.argv[1:]] 

parser=argparse.ArgumentParser() 
parser.add_argument('--file1') 
parser.add_argument('--file2') 
options=parser.parse_args(arguments) 
+0

Позиционные аргументы мне недостаточны. Например, файл1 может быть пропущен, файл2 введен, файл3 пропущен, вставлен файл4, и назначение важно (т.е. мне нужно знать, что это были файлы file2 и file4, которые были указаны пользователем) – jvm

+1

@jvm - Как argparse (или что-нибудь) должно было знать, что файл, который вы дали, является 'file2' вместо' file1'? Если вы не можете разобраться с порядком, который он пришел в командной строке, то, безусловно, 'argparse' тоже не сможет этого сделать. – mgilson

+0

Являются константными строками 'file1' и' file2', или они являются именами файлов - возможно, именно это я не понимаю здесь ... – mgilson