循环中的Python ** kwargs修改

时间:2018-07-19 16:46:57

标签: python python-3.x

当我尝试在程序下运行时,在第二个循环中收到错误消息,提示 第二个func有多个值,我希望这个程序循环运行。 我的假设是Kwargs Rude不会再使用相同的值进行更新。

问题1:kwargs.update(animal =“ Lion”)是否正确修改值?

问题2:为什么我收到错误消息?

下面的代码仅用于学习目的,无其他意图。 任何帮助表示赞赏。

我使用Python 3.6

  

Second_Func(variable1,** kwargs,Rude =“ leone”)以下的错误消息   TypeError:Second_Func()获得了多个关键字参数值   '粗鲁'

NiceVar = "Buddy"

def First_Func(variable1,**kwargs):
    for name,value in kwargs.items():
        print("First man",name)
    kwargs.update(animal = "Lion")
    Second_Func(variable1,**kwargs,Rude="leone")

def Second_Func(value1,**kwargs):
    for name,value in kwargs.items():
        print("Second man",value)
    Third_Func(value1,**kwargs,band="martin")

def Third_Func(google,**kwargs):
    for name,value in kwargs.items():
        print("Third man",value)
    print("my Third Function",google)
    First_Func(google,**kwargs)

First_Func(NiceVar,Animal ="man")

2 个答案:

答案 0 :(得分:2)

欢迎使用StackOverflow!

所以,这里有几件事。

  1. 在python中,我们倾向于为类名保留TitleCaseNames(类似),并仅对变量和函数使用小写字母。那只是约定,但这是您应该采用的约定。
  2. 如果您只是想替换字典中某个键的值,那么kwargs['animal'] = 'Lion'就足够了。 kwargs实际上只是一本字典,没什么特别的。 **只是告诉函数将所有额外的关键字args集中到该字典中。
  3. 问题在于该程序再次递归(Third_Func调用First_Func)。因此,在第一时间,First_Func将kwarg Rude设置为"leone",然后将其传递给函数行。然后,当它再次回到First_Func时,kwargs现在包含来自调用栈的键'Rude'。然后,您尝试通过一个kwarg文字将原始 Rude kwarg(在kwargs内部)和Rude的第二个副本传递给{{1} }。当名为kwarg的名称具有两个值时,Python并不知道您的意思,因此它会崩溃。

希望可以解决问题!

示例代码:

Second_Func

答案 1 :(得分:1)

  • 问题1:是的,kwargs.update是正确的方法之一。但是根据一些观察,比 分配。了解有关此here的更多信息。

  • 问题2:因为您是从Third_Func再次致电First_Func来收集以前收集的所有kwarg。然后,当Second_Func 再次添加Rude="leone"被调用,您将得到 错误。请注意此处,此时kwargs已经包含一个 键Rude,因此会出现重复项。

还要注意,即使解决了这个问题,您也将获得无穷的递归。