【Python】**kwargs和takes 1 positional argument but 2 were given

Python的函数定义中可以在参数里添加kwargs——简单来说目的是允许 添加不定参数名称的参数,并作为 字典传递参数。但前提是——你必须提供 参数名**。

例如下述情况:

1 class C():
2     def __init__(self, **kwargs):
3         print(kwargs)

有如下输入:

In [48]: c = C()
{}

In [49]: c = C(a = 1)
{'a': 1}

这一切都符合常理。但是当我使用一个字典传递的时候:

In [50]: c = C({'a': 1})

我一开始以为是__init__太娇气了,换成一般办法:

1 In [51]: class C():
2     ...:     def f(self, **kwargs):
3     ...:         print(kwargs)
4     ...:
In [52]: c = C()

In [53]: c.f({'a': 1})

TypeError: f() takes 1 positional argument but 2 were given

包括定义在__main__下的函数也是如此:

In [54]: def f1(**kwargs):
    ...:     print(kwargs)
    ...:

In [56]: f1({'a': 1})

TypeError: f1() takes 0 positional arguments but 1 was given

但是当我在f1参数前加一个 参数名

1 In [57]: f1(b = {'a': 1})
2 {'b': {'a': 1}}

问题立刻解决。

思考:

我们在先前的错误尝试中,一直传入的是个 单纯的字典。虽然kwargs提供将参数转成字典的功能,但是 直接传入字典并不会使其理解成参数。实质上Python解释器认为我们输入的是 作为参数值的字典,而并未携带 参数名称,而Python函数机制中”固定名称”的参数应写在kwargs的前面,因此误以为我们传入了一个”固定名称”参数,事实上我们先前的定义中并未加入”固定名称”参数,所以报错 takes 1 positional arguments but 2 was given

如果真的要传入字典怎么办呢?这就简单了,直接把 *kwargs*改成 kwargs**即可:

1 In [58]: class C():
2     ...:     def __init__(self, kwargs):
3     ...:         print(kwargs)
4     ...:
5
6 In [59]: c = C({'a': 1})
7 {'a': 1}

这次经历使我加深了对**kwargs特殊参数的理解。以后的学习更要注意细节!

Original: https://www.cnblogs.com/littleye233/p/11618990.html
Author: 小叶Little_Ye
Title: 【Python】**kwargs和takes 1 positional argument but 2 were given

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/606340/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • linux磁盘配额管理

    磁盘配额是一种磁盘空间的管理机制,使用磁盘配额可限制用户或组在某个特定文件系统中能使用的最大空间 1、查看内核是否支持磁盘配额 grep “CONFIG_QUOTA&#…

    Linux 2023年5月27日
    088
  • DDL(操作表和数据库)

    数据定义语言,用来定义数据库对象:数据库,表,列等 readme 注意本博客中的 操作数据库 查询 show databases; 创建 创建数据库 create database…

    Linux 2023年6月7日
    067
  • 消费税

    1994年税制改革时,我国才设置了独立的消费税,与实行普遍征收的增值税配套,对特定消费品进行特殊调节。 消费税的特点: (一)征税范围具有选择性 有选择地确定若干个征税项目,在税法…

    Linux 2023年6月14日
    099
  • Tomcat

    Tomcat Tomcat tomcat简介 tomcat的用处 部署tomcat 测试访问 访问Host Manager界面 访问Server Status tomcat简介 T…

    Linux 2023年6月6日
    0117
  • Linux 时间操作及其同步

    本文将以 Arch Linux 为例,讨论 Linux 的时间操作和同步方法。 操作系统的时间 (clock) 由三或四部分决定: 时间值; 是否为 UTC 时间; 时区; (如果…

    Linux 2023年5月27日
    089
  • 方法的深度理解

    权限修饰符 返回值类型 类名(行参列表 )throws 异常的类型{ //方法体 约定俗称:子类中叫重写的方法,父类中叫被重写的方法。 ①子类重写的方法名和行参列表和父类被重写的方…

    Linux 2023年6月14日
    088
  • Redis持久化原理 — RDB与AOF详细解释

    一、持久化的作用 持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。持久化Redis所有数据保持在内存中,对数据的更新将异步地保存…

    Linux 2023年5月28日
    062
  • Web Api单元测试写法

    例如我们在Web Api项目中有个Controller 如果你在单元测试中直接调用 SomeController 的Get()方法,那么你将会收到一个Exception提示Requ…

    Linux 2023年6月14日
    077
  • Running powershell scripts during nuget package installation and removal

    来源:https://devblogs.microsoft.com/nuget/NuGet-3-What-and-Why/ Since Visual Studio 2015 was…

    Linux 2023年5月28日
    094
  • JQ 实现对比两个文本的差异并高亮显示差异部分

    利用jq对比两段文本的差异,差异的内容用不同颜色表示出来。 在线参考demo:http://incaseofstairs.com/jsdiff/ 项目地址:https://gith…

    Linux 2023年6月7日
    0104
  • 高等代数:5 矩阵的相抵与相似

    5 矩阵的相抵与相似 1、设S,M是两个集合,则集合 ({(a,b)|a \in S,b \in W}) 称为S与M的 笛卡儿积,记作:(S \times M)。 2、定义1:设S…

    Linux 2023年6月8日
    095
  • PHP 通过两个日期计算年龄

    参数:$birth_year:出生年份;$birth_month:出生月份;$birth_day:出生日 function getAgeByBirth($birth_year,$b…

    Linux 2023年6月7日
    091
  • Linux网络智障问题排查汇总

    Q: Linux 客户端应用接收不到组播:A: 检查客户端的 Linux 系统,可能没有配置 net.ipv4.conf.ethx.rp_filter = 0 的内核参数 Q: 在…

    Linux 2023年6月14日
    071
  • 5.5 Vim移动光标命令汇总

    Vim 文本编辑器中,最简单的移动光标的方式是使用方向键,但这种方式的效率太低,更高效的方式使用快捷键。 Vim 移动光标常用的快捷键及其功能如下面各表所示,需要注意的是,表中所有…

    Linux 2023年6月7日
    094
  • 华为云服务器数据库配置远程连接

    华为云服务器数据库配置远程连接 起因 暑期购买了华为云的一台服务器进行开发 在上面部署了MySQL数据库,由于app中修改用户信息存在未修复的bug,经常会出现登录密码为空,导致账…

    Linux 2023年6月13日
    0121
  • k4t系统架构 & 部署最佳实践

    《kaiiit船长》 容器自动管理软件 (k4t,国产k8s) k4t系统架构 & 部署最佳实践 文档修订时间: 2021-11-20 关键词 : k4t kaiiit 船…

    Linux 2023年6月13日
    090
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球