2015-11-03 8 views
6

Ho bisogno di lasciare che l'utente finale del mio pitone tipi di script qualcosa di simile:Come creare un argomento di tipo "lista di coppie" con argparse?

script.py -sizes <2,2> <3,3> <6,6> 

dove ogni elemento dell'opzione -sizes è una coppia di due numeri interi positivi. Come posso ottenere questo con argparse?

+0

è l'ingresso esattamente '<2,2><3,3>' o '2,2 3,3 4,4' – idjaw

+0

@idjaw Non ci sono specifiche sull'input. ho solo bisogno di lasciare che l'utente inserisca taglie di due interi (dimensioni xey) –

+2

'nargs = 2' e' action = 'append'' ti permette di analizzare' --s 2 2 -s 3 3 -s 6 6 '. – hpaulj

risposta

7

definire un tipo personalizzato:

def pair(arg): 
    # For simplity, assume arg is a pair of integers 
    # separated by a comma. If you want to do more 
    # validation, raise argparse.ArgumentError if you 
    # encounter a problem. 
    return [int(x) for x in arg.split(',')] 

quindi utilizzare questo come il tipo per un argomento regolare:

p.add_argument('--sizes', type=pair, nargs='+') 

Poi

>>> p.parse_args('--sizes 1,3 4,6'.split()) 
Namespace(sizes=[[1, 3], [4, 6]]) 
+0

Ma attenzione per '--size 1, 3 4 , 6 '. La shell dividerà queste coppie. – hpaulj

+0

L'ho inserito nella categoria di errore utente; l'uso corretto di '--size' come definito * richiede * che gli argomenti siano corretti. – chepner

1

Argparse non tenta di coprire tutti i possibili formati di dati di input. È sempre possibile ottenere sizes come stringa e analizzare con poche righe di codice:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--sizes', nargs='+') 

args = parser.parse_args() 

try: 
    sizes = [tuple(map(int, s.split(',', maxsplit=1))) for s in args.sizes] 
except Exception: 
    print('sizes cannot be parsed') 

print(sizes) 

"casi speciali non sono abbastanza speciale per rompere le regole."

Problemi correlati