【问题标题】:TypeError: __init__() got an unexpected keyword argument 'type' in argparseTypeError: __init__() 在 argparse 中得到了一个意外的关键字参数 'type'
【发布时间】:2016-02-08 00:59:45
【问题描述】:

嘿,所以我正在使用 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 运行它,它给了我以下错误:

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

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

【问题讨论】:

  • 请重新格式化该代码,它很难阅读 - 每行前 4 个字符将使其成为一个代码块。
  • 你为什么使用action='store_true'?您对这样做的理解是什么?
  • 稍后在代码中我会检查存储在 argparse 中的变量是否为真。如果他们是我执行一些代码。
  • 这根本不是store_true 的工作原理,甚至真相在 Python 中的工作原理。
  • store_true 的目的是为命名变量保存值True。为同一选项指定 type 值是没有意义的,也是不允许的。

标签: python parsing argparse


【解决方案1】:

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" 和 'type'。

【讨论】:

  • 该死的教程。如果您想要像 -q 这样的简短版本,它们会让您看起来需要 action="store_true"
【解决方案2】:

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

特别是,参数所需的实际信息因action 而异。

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

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

如果您希望用户给出我建议使用的这四个数字之一

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

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

https://docs.python.org/3/library/argparse.html#action 中的示例很好地说明了每个动作类所采用的参数。

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

【讨论】:

  • 有趣,因此内置了“可选性”风格,例如,无需执行nargs='?',这显然与内置/默认设计相冲突。
  • Action 基类有 2 个参数和 8 个关键字参数。但是对于“store_true”子类_StoreTrueAction 子类,其中只有3 个关键字在其__init__ 中,并且只有help 有意义。类继承提供了很大的灵活性,但有时会使准确的文档变得困难。
  • argparse required 上的文档可能对 docs.python.org/2/library/argparse.html#required 有帮助
  • 收到此错误时感到困惑,原来使用action='store_true',不需要type=,会导致错误。只需将其删除即可解决问题。
  • 太棒了!这个建议非常适合我的目标。我本来将有两个相互排斥的参数,我想存储常量(一个是 3,另一个是 4),但它不允许我使用 type=int。 “官方”回答告诉我为什么这不起作用,但您的回答向我展示了一种更好的方法来做我真正想要的:提供一系列独家版本号。如果它出现的话,这更容易扩展以支持(我的脚本的)版本 5。太棒了!
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 2017-10-16
  • 2020-10-22
  • 2021-11-17
  • 2016-11-01
  • 2021-10-21
  • 2021-10-15
  • 2021-12-30
相关资源
最近更新 更多