在函数调用和定义中都使用**kwargs



假设我有一个函数get_data,它接受一些关键字参数。有什么办法我可以做到这一点吗

def get_data(arg1, **kwargs):
    print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 
get_data(arg1, **data)

所以这个想法是避免在函数调用和函数定义中键入参数名称。我以字典作为参数调用函数字典的键值成为函数的局部变量它们的值是字典值

我尝试了上面的并得到错误说global name 'arg2' is not defined。我知道我可以改变get_data定义中的locals()以获得所需的行为。

所以我的代码是这样的
def get_data(arg1, kwargs):
    locals().update(kwargs)
    print arg1, arg2, arg3, arg4
arg1 = 1
data['arg2'] = 2 
data['arg3'] = 3 
data['arg4'] = 4 
get_data(arg1, data)

也不会起作用。如果不使用locals(),我也可以实现这种行为吗?

**kwargs是一个普通字典。试试这个:

def get_data(arg1, **kwargs):
    print arg1, kwargs['arg2'], kwargs['arg3'], kwargs['arg4']

还有,检查文档中的关键字参数

如果我们检查你的例子:

def get_data(arg1, **kwargs):
    print arg1, arg2, arg3, arg4

get_data函数的命名空间中,有一个名为arg1的变量,但没有名为arg2的变量。因此,您无法访问不在您的命名空间中的函数或变量。

实际上,在您的命名空间中;有一个变量arg1和一个dictionary对象kwargs。在kwargs之前使用**表示法(名称kwargs在这里不重要,它也可以是其他东西)告诉你的python编译器kwargs是一个字典,该字典中的所有值将在你的函数定义中作为命名参数计算。

让我们看一下这个例子:

def myFunc(**kwargs):
    do something
myFunc(key1='mykey', key2=2)

当您使用命名参数key1key2调用myFunc时,您的函数定义的行为类似于

def myFunc(key1=None, key2=None):

but有一个异常!由于myFunc没有命名参数,编译器不知道如何直接处理它们,因为你可以将任何命名参数传递给你的函数。

你的函数接受字典中的命名参数就像你调用你的函数一样:

myFunc({key1:'mykey', key2:2})

因此,函数定义在字典中获取这些参数。**kwargs在这一点上定义了您的字典,这也告诉编译器将接受任何命名参数(通过在kwargs之前的**符号的帮助)

def myFunc(**kwargs):
    print kwargs

将打印

{key1:'mykey', key2:2}

在你的例子中,你可以像字典一样使用kwargs;

def myFunc(**kwargs):
    kwargs['arg2']
    kwargs.get('arg3')
如:

最新更新