2015-11-06 6 views
8

Hey, also benutze ich argparse, um einen vierteljährlichen Bericht zu erstellen. Dies ist, was der Code wie folgt aussieht:TypeError: __init __() hat ein unerwartetes Schlüsselwortargument "type" 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() 

die Fehler, die ich erhalten ist:

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

soweit ich von der argparse Dokumentation Typ ist einer der Parameter der add_argument Funktion berichten. Ich habe versucht, diese zu entfernen und die Aktualisierung des Codes:

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() 

ich dann zu laufen versuchte es mit: python scriptname.py -q 1 -y 2015 und es gibt mir die folgende Fehlermeldung:

error:unrecognized arguments: 1 2015

Ich weiß nicht, warum das so ist entweder. Kann jemand bitte etwas Licht in diese Sache bringen?

+0

Bitte formatieren Sie diesen Code, es ist schwer zu lesen - 4 Zeichen vor jeder Zeile wird es zu einem Codeblock machen. – davejagoda

+1

Warum verwenden Sie 'action = 'store_true''? Was war dein Verständnis davon, was das tun würde? – user2357112

+0

später im Code ich überprüfe, ob die in argparse gespeicherten Variablen wahr sind. wenn sie sind, führe ich etwas Code aus. –

Antwort

12

Was bedeutet action="store_true" bedeutet, dass, wenn das Argument in der Befehlszeile angegeben wird, sollte ein True Wert im Parser gespeichert werden. Was Sie eigentlich wollen, ist das Jahr (als String) und das Viertel (als Int) zu speichern.

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() 

Wenn Sie angeben action='store_true argparse intern eine _StoreAction Instanz, deren Konstruktor instanziieren nicht akzeptiert einen type Parameter (da es immer sein wird, einen Boolean (True/False)). Sie können action="store_true" nicht gleichzeitig eingeben und 'type' eingeben.

+0

vielen Dank das war sehr aufschlussreich –

1

Die Dokumentation argparse ist nicht so detailliert wie sie sein könnte (hat aber immer noch mehr Informationen, als viele Benutzer aufnehmen können).

Insbesondere die tatsächlichen Informationen, die ein Argument benötigt, variiert mit action.

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

A store_true handeln keine Parameter (d.h. nargs = 0). Der Standardwert lautet False. Bei Verwendung wird das Attribut auf True gesetzt.

Wenn Sie wollen, dass der Benutzer eine dieser vier Zahlen geben, ich würde vorschlagen, mit

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

https://docs.python.org/3/library/argparse.html#choices ein ähnliches Beispiel hat.

Die Beispiele in https://docs.python.org/3/library/argparse.html#action geben eine ziemlich gute Vorstellung davon, welche Parameter jede Aktionsklasse benötigt.

Es gibt einen Python-Bug/ein Problem, bei dem entweder die Dokumentation oder die Fehlermeldung verbessert wird, wenn in der Funktion unnötige Parameter angegeben werden. So wie es aussieht, ist es die Python-Unterklassen-Definition, die die Fehlermeldung ausgibt.

+0

Vielen Dank! Ich werde das versuchen und sehen, ob es funktioniert –

+0

Interessant, um so die "Optionalität" Geschmack ist eingebaut, keine Notwendigkeit zu tun, "nargs ="? "" zum Beispiel, die offenbar mit dem eingebauten/Standard-Design konfligiert. – jxramos

+0

Die Basisklasse 'Aktion' hat 2 Parameter und 8 Schlüsselwortparameter. Aber für die Unterklasse 'store_true', die Unterklasse '_StoreTrueAction', sind nur 3 dieser Schlüsselwörter in ihrem '__init__' und nur die' help' macht Sinn. Die Klassenvererbung bietet viel Flexibilität, erschwert jedoch manchmal eine genaue Dokumentation. – hpaulj

Verwandte Themen