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

Passing default parameters into nested functions python

我有一个功能

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

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

我是从

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)

是否有一种 "nice"/Pythonic 方法可以将默认参数的子集以这种方式传递到多层函数中?

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

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

settings2 的 2 种用法与上下文不同?

您可以避免重新定义函数中的所有参数,只需使用 **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

请注意,由于 ykwargs 之外,因此将 y 作为关键字传递也有效。

唯一的缺点是您不知道可以实际传递给 bar 的内容,但这符合逻辑,因为它取决于 foo 接受的内容。通过向您的函数添加文档字符串来弥补这一点。

直接回答你的问题:是的,Python 足够聪明,不会混淆同名的局部变量和出站函数参数。示例:

def x(a):
    ...

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

在return行中,右边的a是传入函数y的参数的局部变量,左边的a是函数 x 的参数。

被调用函数的参数名称在被调用函数的参数列表的命名空间中,与调用上下文的局部变量和全局变量无关。