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

Big*_*VAA 22 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()
Run Code Online (Sandbox Code Playgroud)

我收到的错误是:

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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Seb*_*ian 28

什么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()
Run Code Online (Sandbox Code Playgroud)

当你指定action='store_trueargparse时,内部实例化一个_StoreAction构造函数不接受type参数的实例(因为它总是一个布尔值(True/False)).您无法同时提供action="store_true"和"输入".


hpa*_*ulj 5

argparse文档没有尽可能详细(但仍具有许多用户无法吸收的更多信息)。

特别是,参数所需的实际信息随改变action

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

一个store_true动作不带任何参数(即nargs = 0)。它的默认值为False,如果使用,则属性设置为True

如果您希望用户提供这四个数字之一,我建议您使用

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

https://docs.python.org/3/library/argparse.html#choices也有类似的示例。

https://docs.python.org/3/library/argparse.html#action中的示例可以很好地了解每个操作类采用的参数。

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