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特殊参数的理解。以后的学习更要注意细节!

最新文章

  1. 使用HTML 和CSS 开发商业站点
  2. JSOI2016R3 瞎BB题解
  3. android中所有颜色大全
  4. 实操UNITY3D接入91SDK安卓版
  5. [ucgui] 对话框7——按钮触发与模式窗口
  6. Source insight 3572版本安装及An invalid source insight serial number was detected解决方法
  7. Jmeter接口测试-badboy录制脚本(二)
  8. 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/
  9. Android获取SIM卡信息--TelephonyManager
  10. Android实现购物车功能
  11. 从Android源码修改cpu信息
  12. Rollup.js 实践
  13. Spring AOP 的实现机制
  14. vue 监听手机键盘是否弹出及input是否聚焦成功
  15. Swift DispatchQueue
  16. hive sql 里面的注释方式
  17. 洛谷.4234.最小差值生成树(LCT)
  18. 类的copy和deepcopy
  19. 【shell脚本】通过遍历文件的一种批量执行shell命令的方法。
  20. 关于“最小的K个数”问题

热门文章

  1. Chrome浏览器报错:ERR_UNSAFE_PORT
  2. 使用vagrant一键部署本地php开发环境(一)
  3. R-CNN/Fast R-CNN/Faster R-CNN
  4. 总结SQL查询慢的50个原因
  5. MongoDB安装成windows 服务
  6. Spark中的CombineKey()详解
  7. haproxy配置文件实例
  8. Ubuntu 18.04 上使用xrdp远程桌面连接
  9. iOS——归档对象的创建,数据写入与读取
  10. Django -- DateTimeField