【Python】**kwargs和takes 1 positional argument but 2 were given
2024-09-05 05:26:25
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特殊参数的理解。以后的学习更要注意细节!
最新文章
- 使用HTML 和CSS 开发商业站点
- JSOI2016R3 瞎BB题解
- android中所有颜色大全
- 实操UNITY3D接入91SDK安卓版
- [ucgui] 对话框7——按钮触发与模式窗口
- Source insight 3572版本安装及An invalid source insight serial number was detected解决方法
- Jmeter接口测试-badboy录制脚本(二)
- 【转载】Android Studio jar、so、library项目依赖,原文链接http://zhengxiaopeng.com/2014/12/13/Android-Studio-jar、so、library项目依赖/
- Android获取SIM卡信息--TelephonyManager
- Android实现购物车功能
- 从Android源码修改cpu信息
- Rollup.js 实践
- Spring AOP 的实现机制
- vue 监听手机键盘是否弹出及input是否聚焦成功
- Swift DispatchQueue
- hive sql 里面的注释方式
- 洛谷.4234.最小差值生成树(LCT)
- 类的copy和deepcopy
- 【shell脚本】通过遍历文件的一种批量执行shell命令的方法。
- 关于“最小的K个数”问题