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. 删除git中无用的大文件

    推荐阅读:为什么你的 Git 仓库变得如此臃肿 有时候我们不小心提交了一些大文件上去,后来删除了,但是已经于事无补了,整个git的提及已经蹭蹭上去了. 这个时候怎么办呢? 1. 查看有哪些大文件(to ...

  2. 普转提——有趣的数,欢乐ABC,打游戏

    有趣的数——构造符合条件的数 给你一个区间,问有多少个数符合每一位中,只有一个数字和其他数字不同,也就是其他数字都相同,有且只有一个异类: 数据范围是1e16: 因为只考虑数量而不用管大小: 只要0到 ...

  3. Linux快速编译

    #include<bits/stdc++.h> using namespace std; string name, tmp, s; int main() { cin >> tm ...

  4. mysql.zip版本的安装教程

    MySQL zip版本安装 一直以来都习惯了使用MySQL安装文件(.exe),今天下载了一个.zip版本的MySQL,安装过程中遇到了一些问题,如下: 1.在MySQL官网上(http://dev. ...

  5. make 和 make install 的区别

    简单来说,make 是编译,make install 是安装. 总结:linux编译安装中configure.make和make install各自的作用 ./configure是用来检测你的安装平台 ...

  6. AddLayer和AddTag

    using System.Collections; using System.Collections.Generic; using UnityEditor; using UnityEngine; pu ...

  7. hey is a tiny program that sends some load to a web application.

    hey is a tiny program that sends some load to a web application. DOS attack DOS攻击生成 https://github.c ...

  8. php+mysql模糊查询功能

    一般模糊查询语句如下: SELECT 字段 FROM 表 WHERE 某字段 Like 条件 其中关于条件,SQL提供了四种匹配模式: 1,% :表示任意0个或多个字符.可匹配任意类型和长度的字符,有 ...

  9. c++ string操作

    #include <iostream>#include <string> using namespace std; int main(){ string str1(" ...

  10. Windows10 64位安装DB2数据库

    安装前准备 : 系统:Windows10 64位 DB2 v9.5下载地址(迅雷):http://big3.ddooo.com/db2_93661.rar 选择安装包解压位置,并复制记住: 去到解压的 ...