传递默认参数为嵌套函数蟒蛇

问题描述:

我有一个函数传递默认参数为嵌套函数蟒蛇

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

(其实这是和一帮,而我需要设置只有1个外部默认参数第三方库的功能,但为求例如..

的),我从

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

这是确定调用此,但在风格上我宁愿称之为名称的参数settings2_insettings2。当我继续传递另一个图层时,我将不得不重新命名参数,并且它变得很难看。

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个用途是从上下文不同?

+0

只是'酒吧(y,** kwargs)'然后'foo(x,** kwargs)'我猜 –

+0

** kwargs看起来像很好地做到这一点。谢谢! –

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

def x(a): 
    ... 

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

在返回管线中,右手a是从传递到功能y和左手a参数局部变量是起作用x参数。

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

+0

好 - 我可能应该只是测试过它,但很高兴知道,谢谢 –

+0

我看到你是一个新的StackOverflow用户,一个提示 - 一旦你决定哪个答案对你最有帮助,使用复选标记接受这个答案。 –

+0

这两个答案都很好,但这是直接的答案。另外,谢谢 –

您可以避免重新定义函数中的所有参数,只需使用**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接受的内容。通过向你的函数添加一个文档字符串来做到这一点。