web-dev-qa-db-fra.com

TypeError: __init __ () a obtenu un argument de mot clé inattendu 'type' dans argparse

Bonjour, j'utilise argparse pour essayer de générer un rapport trimestriel. Voici à quoi ressemble le code:

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'erreur que je reçois est:

TypeError: init () a obtenu un argument de mot clé inattendu 'type'

autant que je sache du type de documentation argparse est l'un des paramètres de la fonction add_argument. J'ai essayé de supprimer cela et de mettre à jour le code pour:

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

J'ai ensuite essayé de l'exécuter avec: python scriptname.py -q 1 -y 2015 et cela me donne l'erreur suivante:

erreur: arguments non reconnus: 1 2015

Je ne sais pas non plus pourquoi. Quelqu'un peut-il nous éclairer à ce sujet?.

22
Big_VAA

Quelle action="store_true" signifie que si l'argument est donné sur la ligne de commande, une valeur True doit être stockée dans l'analyseur. Ce que vous voulez réellement, c'est stocker l'année donnée (sous forme de chaîne) et le trimestre (sous forme d'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()

Lorsque vous spécifiez action='store_true argparse instancie en interne un _StoreAction instance dont le constructeur n'accepte pas un paramètre type (car ce sera toujours un booléen (True/False)). Vous ne pouvez pas fournir action="store_true" et 'type' en même temps.

27
Sebastian

La documentation argparse n'est pas aussi détaillée qu'elle pourrait l'être (mais contient toujours plus d'informations que de nombreux utilisateurs peuvent en absorber).

En particulier, les informations réelles dont un argument a besoin varient avec action.

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

UNE store_true l'action ne prend aucun paramètre (c'est-à-dire nargs = 0). Sa valeur par défaut est False, et s'il est utilisé, l'attribut est défini sur True.

Si vous souhaitez que l'utilisateur donne l'un de ces quatre chiffres, je vous suggère d'utiliser

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

https://docs.python.org/3/library/argparse.html#choices a un exemple similaire.

Les exemples de https://docs.python.org/3/library/argparse.html#action donnent une assez bonne idée des paramètres utilisés par chaque classe d'action.

Il y a un Python bogue/problème concernant l'amélioration de la documentation ou du message d'erreur lorsque des paramètres inutiles sont donnés dans la fonction. En l'état, c'est le Python = définition de sous-classe qui émet le message d'erreur.

4
hpaulj