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

例如下述情况:

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

有如下输入:

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

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

In [50]: c = C({'a': 1})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-50-2be6d5be2a84> in <module>()
----> 1 c = C({'a': 1})

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

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

In [53]: c.f({'a': 1})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-53-5daee03baab1> in <module>()
----> 1 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 Traceback (most recent call last)
<ipython-input-56-8652a6e75162> in <module>()
----> 1 f1({'a': 1}) TypeError: f1() takes 0 positional arguments but 1 was given

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

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

问题立刻解决。


思考:

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

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

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

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

【Python】**kwargs和takes 1 positional argument but 2 were given的更多相关文章

  1. python:TypeError: main() takes 0 positional arguments but 1 was given

    TypeError: main() takes 0 positional arguments but 1 was given def main(self): 括号里加上self就好了

  2. Python Threading问题:TypeError in Threading. function takes 1 positional argument but 100 were given

    在使用python多线程module Threading时: import threading t = threading.Thread(target=getTemperature, args = ( ...

  3. 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案

    在搭建自动化框架时,遇到一个问题,如下图: 根据报错的意思,应该是__init__函数的问题, 位置应该是HomePage文件 立马去查看一下文件,如图: 原来是因为的粗心大意__init__(sel ...

  4. Python:XXX missing X required positional argument: 'self'

    代码的一个小小Bug有时候会让人焦头烂额,费了很大劲搞明白的问题,如果不记录下来,是很容易遗忘的! 定义一个类,如果按照以下的方式使用,则会出现TypeError: testFunc() missin ...

  5. Python基础-TypeError:takes 2 positional arguments but 3 were given

    Error: 今天写一段简单类定义python代码所遇到报错问题:TypeError: drive() takes 2 positional arguments but 3 were given 代码 ...

  6. 执行python manage.py makemigrations时报错TypeError: __init__() missing 1 required positional argument: 'on_delete'

    在执行python manage.py makemigrations时报错: TypeError: __init__() missing 1 required positional argument: ...

  7. Python 'takes exactly 1 argument (2 given)' Python error

    Python,定义urlConfig 接收参数,正常传递参数时,出现,多给了一个参数的错误问题, 定义class的函数之后,在调用的时候出现“'takes exactly 1 argument (2 ...

  8. Django :执行 python manage.py makemigrations 时报错 TypeError: __init__() missing 1 required positional argument: 'on_delete'

    原因 执行命令 python manage.py makemigrations 报错 TypeError: __init__() missing 1 required positional argum ...

  9. 【Selenium+Python Webdriver】报错之:TypeError: user_login() missing 1 required positional argument: 'self'

    先贴一下源码: base.py文件如下: from selenium import webdriver class Page(object): ''' 页面基础类,用于所有页面的继承 ''' rb_u ...

随机推荐

  1. scrapy框架之基础

    一.安装scrapy 安装失败看博客>>>scrapy安装失败解决方案 pip install wheel pip install twisted pip install pywin ...

  2. 微信小程序开发-踩坑

    异步请求处理 详情描述: 微信小程序的wx.request({})请求时异步处理,以下代码 wx.reuest({ url:"https://XXXA", method:" ...

  3. Singleton模式(单例模式) 饿汉式和懒汉式

    目的:整个应用中有且只有一个实例,所有指向该类型实例的引用都指向这个实例. 好比一个国家就只有一个皇帝(XXX),此时每个人叫的“皇帝”都是指叫的XXX本人; 常见单例模式类型: 饿汉式单例:直接将对 ...

  4. Sketch教程

    去年夏天开始用Sketch,觉得它放Dock里闪亮亮的很好看,当时笑称是男盆友送我的第一颗小钻石噗哈哈.所以那段时间几乎刷遍了所有关于 Sketch 的网站.文章.教程,之后又在自学设计,因为想和更多 ...

  5. CISCO实验记录六:EIGRP路由协议

    一.要求 1.查看当前路由协议 2.清空路由设置 3.使用EIGRP协议创建路由 4.查看EIGRP的邻居表 5.关闭自动汇总 6.使用手工汇总 二.实现 1.查看当前路由协议 #show ip pr ...

  6. docker-compose ELK+Filebeat查看docker及容器的日志

    我目前所在公司开发团队比较小,为集团下面的工厂开发了一套小的系统,跑在一台CentOS服务器上,服务器搭建了docker环境,安装了docker-compose,但在日志处理方面,暂时没有一个好的方法 ...

  7. Java-ZipUtil

    Zip 压缩工具类,不支持压缩空文件夹. 简单版 import java.io.FileOutputStream; import java.io.IOException; import java.ni ...

  8. Mac下持续集成-与JMeter与Ant执行后自动发送邮件的整合+定时任务

    mac定时任务的开启: Last login: Tue Aug 13 22:49:54 on ttys004 (base) localhost:~ ligaijiang$ sudo launchctl ...

  9. Android:cmake开发指南

    一.静态库与动态库构建 (.so)共享库,shared object:节省空间,在运行时去连接,如果执行机器上没有这些库文件就不能执行. (.a)静态库,archive:静态库和程序化为一体,不会分开 ...

  10. sysbench 压测

    IP架构 sysbench部署服务器:172.17.100.107 压测服务器:172.17.100.100 MySQL部署目录:/usr/local/mysql 前置工作 1.完成MySQL的安装( ...