2011-12-07 6 views
5

La mia applicazione è un'utility di confronto file specializzata e ovviamente non ha senso confrontare un solo file, quindi nargs='+' non è del tutto appropriato.È possibile che argparse in python 2.7 richieda almeno due argomenti?

nargs=N esclude solo un massimo di argomenti N, ma è necessario accettare un numero infinito di argomenti purché ce ne siano almeno due.

+0

hanno anche uno sguardo a http://stackoverflow.com/quest ioni/4194948/python-argparse-c'è-un-vie-a-specifica-a-gamma-in-nargs. Ciò consente una flessibilità ancora maggiore, senza incasinare (o disturbare) il testo di aiuto. – Evert

risposta

5

non si potrebbe fare qualcosa di simile:

import argparse 

parser = argparse.ArgumentParser(description = "Compare files") 
parser.add_argument('first', help="the first file") 
parser.add_argument('other', nargs='+', help="the other files") 

args = parser.parse_args() 
print args 

Quando eseguo questo con -h ottengo:

usage: script.py [-h] first other [other ...] 

Compare files 

positional arguments: 
    first  the first file 
    other  the other files 

optional arguments: 
    -h, --help show this help message and exit 

Quando eseguo con un solo argomento, non funzionerà :

usage: script.py [-h] first other [other ...] 
script.py: error: too few arguments 

Ma due o più argomenti vanno bene. Con tre argomenti esso stampa:

Namespace(first='one', other=['two', 'three']) 
17

Risposta breve è che non puoi farlo perché nargs non supporta qualcosa come '2+'.

Long risposta è che si può aggirare che l'utilizzo di qualcosa di simile:

parser = argparse.ArgumentParser(usage='%(prog)s [-h] file file [file ...]') 
parser.add_argument('file1', nargs=1, metavar='file') 
parser.add_argument('file2', nargs='+', metavar='file', help=argparse.SUPPRESS) 
namespace = parser.parse_args() 
namespace.file = namespace.file1 + namespace.file2 

I trucchi che avete bisogno sono:

  • Usa usage di fornire proprietario stringa di utilizzo al parser
  • Utilizzare metavar per visualizzare un argomento con un nome diverso nella stringa della guida
  • Utilizzare SUPPRESS per evitare la visualizzazione di aiuto per una delle variabili
  • Unire due variabili diverse solo aggiungendo un nuovo attributo all'oggetto Namespace che il parser restituisce

L'esempio precedente produce il seguente stringa aiuto:

usage: test.py [-h] file file [file ...] 

positional arguments: 
    file 

optional arguments: 
    -h, --help show this help message and exit 

e sarà ancora fallire quando sono passati meno di due argomenti:

$ python test.py arg 
usage: test.py [-h] file file [file ...] 
test.py: error: too few arguments