猿问

在函数调用和定义中都使用** 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。我知道我可以更改的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()吗?


墨色风雨
浏览 326回答 2
2回答

有只小跳蛙

**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 somethingmyFunc(key1='mykey', key2=2)当您myFunc使用命名参数key1和进行调用时key2,您的函数定义的行为类似于def myFunc(key1=None, key2=None):但是有一个例外!由于myFunc没有命名参数,因此编译器不知道如何直接处理它们,因为您可以将任何命名参数传递给函数。因此,您的函数像调用函数一样接受字典中的那些命名参数:myFunc({key1:'mykey', key2:2})因此,您的函数定义会在字典中获取这些参数。**kwargs在这一点上定义您的字典,这也告诉编译器任何命名的参数都将被接受(**在kwarg之前的符号的帮助下)def myFunc(**kwargs):    print kwargs将打印{key1:'mykey', key2:2}因此,在您的示例中,您可以kwargs像字典一样使用。def myFunc(**kwargs):    kwargs['arg2']    kwargs.get('arg3')我希望它并不复杂(:
随时随地看视频慕课网APP

相关分类

Python
我要回答