TypeError: __init__() got an unexpected keyword argument 'type' in argparse

PythonParsingArgparse

Python Problem Overview


Hey so I'm using argparse to try and generate a quarterly report. This is what the code looks like:

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

the error I receive is: >TypeError: init() got an unexpected keyword argument 'type'

as far as I can tell from the argparse documentation type is one of the parameters of the add_argument function. I tried removing this and updating the code to :

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

I then tried to run it with: python scriptname.py -q 1 -y 2015 and it is giving me the following error:

>error:unrecognized arguments: 1 2015

I don't know why that is either. Can anyone please shed some light on this.

Python Solutions


Solution 1 - Python

What action="store_true" means is that if the argument is given on the command line then a True value should be stored in the parser. What you actually want is to store the given year (as a string) and quarter (as an 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()

When you specify action='store_true argparse is internally instantiating a _StoreAction instance whose constructor does not accept a type parameter (since it will always be a boolean (True/False)). You cannot supply action="store_true" and 'type' at the same time.

Solution 2 - Python

The argparse documentation is not as detailed as it could be (but still has more information than many users can absorb).

In particular, the actual information that an argument needs varies with action.

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

A store_true action does not take any parameters (i.e. nargs=0). It's default value is False, and if used the attribute is set to True.

If you want the user to give one of those four numbers I'd suggest using

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

https://docs.python.org/3/library/argparse.html#choices has a similar example.

The examples in https://docs.python.org/3/library/argparse.html#action give a pretty good idea of what parameters each action class takes.

There is a Python bug/issue discussing improving either the documentation, or the error message when unnecessary parameters are given in the function. As it stands, it's the Python subclass definition that is issuing the error message.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionBig_VAAView Question on Stackoverflow
Solution 1 - PythonSebastianView Answer on Stackoverflow
Solution 2 - PythonhpauljView Answer on Stackoverflow