TypeError:__ init __()得到了一个意外的关键字参数' type'在argparse

时间:2015-11-06 19:29:35

标签: python parsing argparse

嘿,所以我使用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()

我收到的错误是:

  

TypeError: init ()得到了一个意外的关键字参数' type'

据我所知,argparse文档类型是add_argument函数的参数之一。我尝试删除它并将代码更新为:

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

然后我尝试使用:python scriptname.py -q 1 -y 2015运行它,它给了我以下错误:

  

错误:无法识别的参数:2015年1月

我不知道为什么会这样。任何人都可以对此有所了解。

2 个答案:

答案 0 :(得分:22)

action="store_true"的含义是,如果在命令行中给出参数,则应在解析器中存储True值。你真正想要的是存储给定年份(作为字符串)和季度(作为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()

当您指定action='store_true时,argparse在内部实例化一个_StoreAction实例,其构造函数不接受type参数(因为它始终是一个布尔值(True / False))。您无法提供action="store_true"和'类型'在同一时间。

答案 1 :(得分:3)

System.Reflection文档并不尽可能详细(但仍有比许多用户可以吸收的信息更多的信息)。

特别是,参数所需的实际信息随argparse而变化。

action

parser.add_argument('-q', "--quarter", action='store_true', type=int, help="Enter a Quarter number: 1,2,3, or 4 ") 动作不接受任何参数(即nargs = 0)。它的默认值为store_true,如果使用,则该属性设置为False

如果您希望用户提供这四个号码中的一个,我建议使用

True

https://docs.python.org/3/library/argparse.html#choices有一个类似的例子。

https://docs.python.org/3/library/argparse.html#action中的示例非常清楚每个动作类采用的参数。

有一个Python错误/问题正在讨论改进文档,或者在函数中给出不必要的参数时的错误消息。就目前而言,它是发出错误消息的Python子类定义。