为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

墨色风雨 2021-03-09 15:12:07
假设我有一个函数get_data,它需要一些关键字参数。有什么办法可以做到这一点def get_data(arg1, **kwargs):    print arg1, arg2, arg3, arg4arg1 = 1data['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, arg4arg1 = 1data['arg2'] = 2 data['arg3'] = 3 data['arg4'] = 4 get_data(arg1, data)而且它也行不通。我也不能不使用而实现行为locals()吗?
查看完整描述

2 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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


def get_data(arg1, **kwargs):

    print arg1, kwargs['arg2'], kwargs['arg3'], kwargs['arg4']

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


查看完整回答
反对 回复 2021-03-24
?
慕慕森

TA贡献1856条经验 获得超17个赞

如果我们检查您的示例:


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)

当您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')

我希望它并不复杂(:


查看完整回答
反对 回复 2021-03-24
  • 2 回答
  • 0 关注
  • 325 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信