了解 TypeError:获得关键字参数的多个值

2024-01-07

我尝试了不同的方法来使用 *args 调用该方法。下面是我的代码片段。

def total(name, *args):
    if args:
        print("%s has total money of Rs %d/- " %(name, sum(args)))
    else:
        print("%s's piggy bank  has no money" %name)

现在有两种方法可以调用这个方法。一种是在 *() 内传递额外的参数或直接用逗号分隔。我故意以 param=value 的形式传递“name”的值,这样它就会抛出错误。以下是我尝试的两种方法:-

1 - 传递额外的参数,以逗号分隔:-

>>> total(name="Adi", 1, 2, 10 )
  File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg

2 - 使用 *() 传递额外参数:-

>>> total(name="Adi", *(1, 2, 10) )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: total() got multiple values for keyword argument 'name'

第一条错误消息非常清楚,并且传达了确切的错误。但是,我无法理解第二次调用的错误消息。

Python 如何评估第二个调用,它获取参数“名称”的多个值?我想到的可能的方式是Python内部会进行翻译

总计(名称=“阿迪”, *(1, 2, 10) )

如下 :-

总计(*(1, 2, 10), 名称=“阿迪”)

在上面的翻译中,根据位置,“name”获取值 *(1,2,10),稍后它再次获取“Adi”。所以多值错误是可以理解的。

但是,我不确定 python 内部是否会改变位置?对此的任何见解都会有所帮助。


我检查了使用的方法inspect模块。这getcallargs()检查模块中的方法,为您提供传递的值到方法参数的映射。

def total(name, *args):
    if args:
        print("%s has total money of Rs %d/- " %(name, sum(args)))
    else:
        print("%s's piggy bank  has no money" %name)

#total(name="Adi", *(1, 2, 10) )
# equivalent call using inspect module
import inspect
print inspect.getcallargs(total, 'Adi', *(1, 2, 10) )

因此,当调用方法时,传递的所有参数都采用以下两种形式之一

*位置:- 所有位置参数(不带关键字)和 *() 内传递的参数或额外的非关键字参数的元组

**named :- 以 param=value 形式传递的所有参数的字典,以及额外的关键字参数

所以在我的通话中total(name="Adi", *(1, 2, 10) ), 'positional'元组的值为 (1,2,10) 且'named'字典有值 {'name':'Adi'}

然后它将值分配给参数。在赋值过程中,首先分配强制参数。 Python 检查强制参数列表(此处为 ['name'])并从'positional'元组顺序。元组中未分配的任何值都被假定为额外参数(非关键字参数)。

因此参数'name'获取分配给它的值 1。其余值(即 2 和 10)被假定为额外参数。

接下来,它检查该方法的签名中是否包含非关键字参数。如果是这样,那么剩余的值来自'positional'元组被分配给相同的。所以在这里'args'被分配给剩余的值,即 (2,10) 的元组。

但是,如果方法签名中没有非关键字参数,并且'positional'元组有一些值仍未分配,然后 python 会抛出错误“方法需要 X 个参数 Y 给定”Y 大于 X。

一旦所有值都来自'positional'被分配,值的分配来自'named'字典被分配。在这种情况下,解释器首先检查字典中是否存在任何强制参数,即任何强制参数的值是否以以下形式传递<param=value>在方法调用中?如果是,那么接下来它会检查在分配值期间是否已将任何值分配给这些强制参数'positional' tuple?

如果是这样,那么它会为同一参数找到两个值(其中一个来自'positional'另一个来自'named'),因此抛出"got multiple values for keyword argument"错误。否则,它将值分配给来自'named'字典。

这样,在上述情况下,论证'name'是强制论证并且存在于'named'我已经通过的字典name="Adi"在方法调用中。在分配位置值期间(值来自'positional'元组),变量'name'已获得分配给它的值 1。并来自命名参数字典(来自的值'named'字典),它的值是“Adi”,这使得 2 个值被分配给变量'name'。因此我们收到错误:-

Total() 获得关键字参数“name”的多个值

因此,在传递非关键字额外参数时,只需传递强制参数的值,这将使其成为位置参数。但是,不是以<param=val>,这将使其命名并获得参数的两个值,因此将引发错误。因此,不建议以以下形式通过强制论证:<param = value >.

所以调用该方法的正确方法是:-

总计('阿迪', *(1,2,10))

or

总计('阿迪', 1, 2, 10)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解 TypeError:获得关键字参数的多个值 的相关文章

随机推荐

  • sqlQuery 的 RODBC 错误处理

    我没有找到任何好的错误测试函数来测试结果sqlQuery这让我很惊讶 在文档中 http www inside r org packages cran rodbc docs sqlQuery http www inside r org pa
  • 使用 PHP 显示 MySQL 数据库中的所有表?

    我正在尝试显示数据库中的所有表 我试过这个 sql SHOW TABLES result conn gt query sql tables result gt fetch assoc foreach tables as tmp echo t
  • _var 和 self.var 之间的区别

    随着所有这些新的 ARC 内容 不属于 NDA 的出现 处理属性的默认设置似乎是在实现文件中显式设置没有 ivar 的属性 直到您使用以下内容综合它 synthesize var var 设置变量的最佳实践是什么 我知道之间的区别var a
  • 将 [(key: String, value: String)] 转换为 [String:String]

    我想将 key String value String 转换为 String String 可以吗 如果是的话我怎么做 谢谢 var KeyValuePair key String value String key 2017 01 04 v
  • 检查输入时出错:预期dense_input的形状为(21,),但得到的数组的形状为(1,)

    如何修复输入数组以满足输入形状 我尝试转置输入数组 如上所述here https stackoverflow com questions 50336110 valueerror error when checking expected de
  • ACE oleDb 驱动程序无法处理巨大的 Excel 文件

    ACE OLEDB 驱动程序对于较大的文件是否存在任何已知问题 我使用下面的代码来检索 400Mb xls 文件中的工作表 public string GetWorkSheets var connectionString Provider
  • C# 中 (int) 和 Convert.toint32 之间的区别

    当我将对象转换为 int 时 int object 然后当对象值为 0 时 他会给我错误 指出特定的强制转换无效 当我将对象转换为 int 时 convert toint32 object 然后他工作并给我 0 意味着演员阵容有效 我想知道
  • 如何在 C++ 中逐行读取文件中的整数组

    我有一个文本文件 每一行都有一个或多个整数 用空格分隔 我怎样才能用 C 优雅地阅读这个内容 如果我不关心行 我可以使用 cin gt gt 但整数在哪一行很重要 输入示例 1213 153 15 155 84 866 89 48 12 1
  • WP REST API 自定义 POST 端点不工作,404 错误

    我正在编写一个插件 但我在使用自定义端点时遇到了一些问题 该端点从应用程序前端 Angular 接收数据 并将向其传递另一个函数来过滤一些数据 我对产品数据库的 GET 请求工作得很好 但 POST 只返回 404 错误 如果我在 Inso
  • 使用淡入淡出动画重绘 UIView?

    In TwUI 有一个方法叫做redraw on TUIView 它强制视图重绘 但它还带有视图的新旧状态之间的自由淡入淡出动画 我想知道在正常情况下是否可能发生类似的事情UIView 基本上 我如何重绘视图 setNeedsDisplay
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • 渲染画布时单词重叠

    我有一个很长的文本要渲染到画布上 并且单词在 Safari 中重叠且混乱 但在 Chrome 中完美运行 我正在使用最新版本的 html2canvas 库 v1 0 0 rc 3 这是 safari 中的输出 https i stack i
  • 错误消息:看起来您缺少一些运行 Electron 所需的依赖项

    全局安装 electro forge 后npm install g electron forge我在与 electro forge 相关的终端中输入的任何命令都会显示以下消息 它似乎缺少运行 Electron 所需的一些依赖项 确保您安装了
  • 根据国家地理 IP 将观众重定向到其他网站

    假设我有一个网站 www abc com featured abc 并且想将除马来西亚以外其他国家 地区的观众重定向 仅该链接 到 YouTube 视频 但 www abc com 仍然是全球性的 是的 我的服务器已经使用 geoip 模块
  • 使用httpwebrequest从网站获取图像到byte[]

    我想读取网站上 PNG 文件的原始二进制文件并将其存储到 byte 中 到目前为止我有这样的内容 Uri imageUri new Uri http www example com image png Create a HttpWebreq
  • 使用 java processbuilder 运行 bat 文件

    我正在尝试使用 java 进程生成器执行 bat 文件 但它不会启动该进程 请告诉我我在这里做错了什么 当我用 file sh 替换 file bat 时 这段代码在 Linux 环境下工作得很好 final ArrayList
  • Python 随机列表理解

    我有一个类似于以下内容的列表 1 2 1 4 5 2 3 2 4 5 3 1 4 2 我想从此列表中创建 x 个随机元素的列表 其中所选元素都不相同 困难的部分是我想通过使用列表理解来做到这一点 如果 x 3 可能的结果是 1 2 3 2
  • Rails 模型回调(创建/更新后)attribute_was 不起作用

    我正在将 Rails 5 1 应用程序迁移到 Rails 5 2 1 在我的模型中 我在创建或更新模型后使用回调来创建活动日志 很遗憾todo name and todo name was始终相同 当前值 这适用于每个属性和每个模型 还ch
  • 如何为 JMenu 子菜单设置加速器?

    我有一个用户请求将加速器添加到子菜单 JMenu 这将允许用户按下快捷键并使相应的子菜单 折叠 显示其包含的菜单项 我不记得每个人都见过这样的东西 无论是在 Java 还是任何其他语言中 我们的应用程序是使用 Swing 用 Ja va 编
  • 了解 TypeError:获得关键字参数的多个值

    我尝试了不同的方法来使用 args 调用该方法 下面是我的代码片段 def total name args if args print s has total money of Rs d name sum args else print s