2015-11-06 24 views
8

Hey, quindi sto usando argparse per provare a generare un rapporto trimestrale. Questo è ciò che il codice è simile:TypeError: __init __() ha ottenuto un argomento di parole chiave imprevisto 'tipo' in argparse

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", action='store_true', type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", action='store_true',type=str,help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

l'errore che ricevo è:

TypeError: init() got an unexpected keyword argument 'type'

per quanto posso dire dal tipo di documentazione argparse è uno dei parametri della funzione add_argument. Ho provato a rimuovere questo e aggiornare il codice per:

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", action='store_true', help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", action='store_true',help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

Allora ho provato a farlo funzionare con: python scriptname.py -q 1 -y 2015 e mi sta dando il seguente errore:

error:unrecognized arguments: 1 2015

Non so perché questo è o. Qualcuno può per favore far luce su questo.

+0

Si prega di riformattare quel codice, è difficile da leggere - 4 caratteri prima di ogni riga faranno essere un blocco di codice. – davejagoda

+1

Perché stai usando 'action = 'store_true''? Qual era la tua comprensione di cosa avrebbe fatto? – user2357112

+0

più avanti nel codice faccio un controllo per vedere se le variabili memorizzate in argparse sono vere. se sono io eseguo del codice. –

risposta

12

Che cosa significa action="store_true" significa che se l'argomento viene fornito sulla riga di comando, un valore True deve essere memorizzato nel parser. Ciò che in realtà si desidera è archiviare l'anno specificato (come stringa) e il quarto (come int).

parser = argparse.ArgumentParser() 

parser.add_argument('-q', "--quarter", type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 
parser.add_argument('-y', "--year", type=str, help="Enter a year in the format YYYY ") 
args = parser.parse_args() 

Quando si specifica action='store_true argparse è istanziare internamente un'istanza _StoreAction cui costruttore non accetta un parametro type (dal momento che sarà sempre un valore booleano (Vero/Falso)). Non è possibile fornire action="store_true" e 'digitare' allo stesso tempo.

+0

grazie mille questo è stato molto perspicace –

1

La documentazione di argparse non è così dettagliata come potrebbe essere (ma ha ancora più informazioni di quante possano essere assorbite da molti utenti).

In particolare, le informazioni effettive che un argomento deve variare con action.

parser.add_argument('-q', "--quarter", action='store_true', type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 

Un store_true azione non accetta parametri (cioè nargs = 0). Il valore predefinito è False e, se utilizzato, l'attributo è impostato su True.

Se si desidera che l'utente per dare uno di quei quattro numeri Io suggerirei usando

parser.add_argument('-q', '--quarter', type=int, choices=[1,2,3,4], help="...") 

https://docs.python.org/3/library/argparse.html#choices ha un esempio simile.

Gli esempi in https://docs.python.org/3/library/argparse.html#action forniscono una buona idea dei parametri utilizzati da ciascuna classe di azioni.

C'è un bug/problema Python che discute il miglioramento della documentazione, o il messaggio di errore quando nella funzione vengono dati parametri non necessari. Così com'è, è la definizione di sottoclasse Python che sta emettendo il messaggio di errore.

+0

Grazie mille! lo proverò e vedrò se funziona –

+0

Interessante, per cui l'aroma "opzionalità" è incorporato, non c'è bisogno di fare 'nargs = '?'' per esempio, che apparentemente è in conflitto con quella struttura incorporata/predefinita. – jxramos

+0

La classe base 'Action' ha 2 parametri e 8 parametri di parole chiave. Ma per la sottoclasse 'store_true', sottoclasse '_StoreTrueAction', solo 3 di quelle parole chiave sono nel suo' __init__', e solo la 'help' ha senso. L'ereditarietà delle classi offre molta flessibilità, ma a volte rende difficile la documentazione accurata. – hpaulj