不使用** kwarg格式识别任意关键字位置参数

时间:2018-04-26 05:47:18

标签: python python-3.x function keyword

我尝试使用**kwarg格式实现具有2个参数和附加第3个任意关键字参数的函数,如下所示:

def build_profile(first_name, last_name, **additional_info):
    """ Building a user profile """
    profile = {}
    profile['First name'] = first_name
    profile['Last name'] = last_name
    for key, value in additional_info.items():
        profile[key.title()] = value.title()
    return profile

build_profile("x", 'y', 'x', 'y', 'x', 'y')

然而,这会产生错误:

TypeError: build_profile() takes 2 positional arguments but 6 were given

我设法使用以下代码单独重现此错误:

def x(**y):
    print(y)

输出:

x(1,2,3,4,5)

这会产生相同的响应:

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

这导致我得出结论:

  1. 我的python配置有问题(在Spyder中运行3.6.4)或
  2. 我错过了一些令人眼花缭乱的事情。

2 个答案:

答案 0 :(得分:2)

函数签名中的**kwargs语法用于接受任意数量的关键字参数,即像f(name=value)一样传入的参数。

def f(**kwargs):
    # kwargs is a dict here

用于接受任意数量的位置参数的语法类似于*args

def f(*args):
    # args is a tuple here

它是***的语法,这个名称的选择只是一个约定 - 如果你愿意,你可以使用其他名称。您也可以指定两者。

def f(*splat, **splattysplat):
    ...

答案 1 :(得分:1)

以下是您需要简约,易懂的方法的示例。

>>> def x(*args):
...    for arg in args:
...        print(arg)

>>> x(1, 2, 3)
1
2
3

>>> def x(**kwargs):
...    for k, v in kwargs.items():
...        print(k, v)

>>> x(name='john', surname='wick')
name john
surname wick