6

假设我有一个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()吗?

4

2 回答 2

11

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

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

此外,请查看有关关键字参数的文档。

于 2013-05-16T12:06:41.703 回答
3

如果我们检查您的示例:

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

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

实际上,在您的命名空间中;有一个变量arg1和一个dictionary名为 的对象kwargs。在(name kwargs 在这里并不重要,它也可以是其他东西。)之前使用**符号告诉你的 python 编译器这是一个字典,并且该字典中的所有值都将作为函数定义中的命名参数进行评估。kwargskwargs

让我们看一下这个例子:

def myFunc(**kwargs):
    do something

myFunc(key1='mykey', key2=2)

当您myFunc使用命名参数调用key1key2,您的函数定义就像

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

有一个例外!由于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')

我希望它并不复杂(:

于 2013-05-16T12:32:57.403 回答