2012-07-03 26 views
12

chciałbym mieć następującą składnię:Python: argparse opcjonalne argumenty bez kresek

python utility.py file1 FILE1 file2 FILE2 

gdzie plik1 i plik2 są opcjonalne argumenty. To proste, aby pracować z tej składni:

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

użyciu

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

jednak, jeśli usunąć kresek argparse zaczyna interpretować go jako pozycyjna zamiast opcjonalnego argumentu ...

Innymi słowy, czy można konkretnie powiedzieć argparse, czy argument jest opcjonalny czy pozycyjny, abym mógł mieć opcjonalne parametry bez myślników?

+2

Ta składnia (bez kresek) jest myląca jak diabli! Istnieje powód, dla którego konwencja istnieje. –

+1

@MartijnPieters: może to być mylące, ale dla niektórych zastosowań naukowych jest to standard ... [przykład] (http://www.ccp4.ac.uk/html/refmac5/description.html) – jvm

+1

@MartijnPieters: Counterprzykład: interfejs wiersza poleceń 'git' lub' svn'. –

Odpowiedz

4

Nie ma sposobu, aby uzyskać argparse, aby zrobić to za Ciebie. Można jednak dokonać argparse przyjąć dowolną liczbę argumentów pozycyjnych:

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

Oczywiście, możesz dodać jakieś kontrole, aby upewnić się, że co najmniej jeden plik dano itd

EDIT

Nadal nie jestem w 100% pewny, czego chcesz, ale jeśli file1 i file2 są literałami, możesz trochę to obejść, przetwarzając wstępnie sys.argv. Oczywiście, będzie to dziwnie sformatować komunikat pomocy, ale zawsze możesz dodać epilog wyjaśniający, że każda z form jest 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

Argumenty pozycyjne nie są dla mnie wystarczające. Na przykład plik1 może zostać pominięty, plik2 wprowadzony, plik3 pominięty, plik4 wprowadzony, a przypisanie jest ważne (tzn. Muszę wiedzieć, że był to plik2 i plik4, które zostały określone przez użytkownika) – jvm

+1

@jvm - jak to jest argparse (lub coś) powinien wiedzieć, że plik, który podałeś to 'file2' zamiast' file1'? Jeśli nie możesz go usunąć z porządku, w którym pojawił się w linii poleceń, na pewno 'argparse' też nie może tego zrobić. – mgilson

+0

Czy ciągi znaków 'plik1' i' plik2', czy są to nazwy plików - może to właśnie tutaj nie rozumiem ... – mgilson

Powiązane problemy