将默认参数传递给嵌套函数python

时间:2017-09-16 11:50:23

标签: python nested parameter-passing default

我有一个功能

foo(x, setting1=def1, settings2=def2)

(实际上这是第三方库函数,有一堆默认参数,我只需要在外部设置1个,但为了示例...)

我是从

打来的
bar(y, settings2_in=def2)
   x = get_x(y)
   foo(x, settings2=settings2_in)

这没关系,但从风格上来说,我宁愿将名称称为参数settings2_in settings2。当我继续向下传递另一层时,我将不得不继续重命名参数,并且它变得丑陋。

bletch(z, settings2_in_2=def2)
   y = get_y(z)
   bar(y, settings2_in=settings_in_2)

是否有一种“漂亮”/ Pythonic方式以这种方式将默认参数的子集传递给多层功能?

如果我这样做,那么Python是否足够聪明:

bar(y, settings2=def2)
   x = get_x(y)
   foo(x, settings2=settings2)

settings2的2次使用与上下文不同?

2 个答案:

答案 0 :(得分:1)

您可以避免重新定义函数中的所有参数,只需使用**kwargs来捕获所有关键字参数。

然后将关键字参数传递给foo函数

def foo(x, setting1="def1", settings2="def2"):
    print(setting1,settings2)


def bar(y,**kwargs):
    foo(y,**kwargs)

bar(12)
bar(y=12)
bar(12,setting1="other")

结果:

def1 def2
def1 def2
other def2

请注意,由于y位于kwargs之外,因此将y作为关键字传递也可以。

唯一的缺点是您不知道实际传递给bar的内容,但它是合乎逻辑的,因为它取决于foo接受的内容。通过向函数添加docstring来实现这一点。

答案 1 :(得分:1)

直接回答你的问题:是的,Python非常聪明,不会将本地变量和出站函数参数混淆为同名。例如:

def x(a):
    ...

def y(a, b):
    return x(a=a)

在返回行中,右侧a是传递给函数y的参数的局部变量,而左侧a是函数{{1}的参数}}。

被调用函数的参数名称位于被调用函数的参数列表的名称空间中,该名称与调用上下文的本地和全局变量无关。