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

时间:2013-05-16 12:02:21

标签: python

假设我有一个函数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。我了解到我可以更改locals()定义中的get_data以获得所需的行为。

所以我的代码看起来像这样

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()的情况下实现此行为?

2 个答案:

答案 0 :(得分:11)

**kwargs是一个简单的字典。试试这个:

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

另外,请查看keyword arguments上的文档。

答案 1 :(得分:3)

如果我们检查你的例子:

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

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

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

让我们看看这个例子:

kwargs

当您使用命名参数def myFunc(**kwargs): do something myFunc(key1='mykey', key2=2) myFunc致电key1时,您的函数定义就像

key2

有异常!由于def myFunc(key1=None, key2=None): 没有命名参数,编译器不知道如何直接处理它们,因为您可以将任何命名参数传递给函数。

因此,您的函数接受字典中的那些命名参数,就像您调用函数一样:

myFunc

因此,您的函数定义会在字典中获取这些参数。 myFunc({key1:'mykey', key2:2}) 在这一点上定义了你的字典,它也告诉编译器任何命名的参数都会被接受(在kwargs之前**kwargs符号的帮助下)

**

将打印

def myFunc(**kwargs):
    print kwargs

因此,在您的示例中,您可以像字典一样使用{key1:'mykey', key2:2} ;

kwargs

我希望它不复杂(: