2017-09-16 84 views
2

我有一個函數傳遞默認參數爲嵌套函數蟒蛇

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看起來像很好地做到這一點。謝謝! –

回答

1

要直接回答您的問題:是的,Python足夠聰明,不會混淆局部變量和出站函數參數的相同名稱。例如:

def x(a): 
    ... 

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

在返回管線中,右手a是從傳遞到功能y和左手a參數局部變量是起作用x參數。

被調用函數的參數名稱位於被調用函數參數列表的名稱空間中,該名稱空間與調用上下文的局部變量和全局變量無關。

+0

好 - 我可能應該只是測試過它,但很高興知道,謝謝 –

+0

我看到你是一個新的StackOverflow用戶,一個提示 - 一旦你決定哪個答案對你最有幫助,使用複選標記接受這個答案。 –

+0

這兩個答案都很好,但這是直接的答案。另外,謝謝 –

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接受的內容。通過向你的函數添加一個文檔字符串來做到這一點。