2017-02-23 34 views
0

我想知道是否有這種「鏈式」命名參數的最佳做法或慣例。我試圖將第一個變量d傳遞到barfoo。這樣做是有點尷尬,我相信應該有一個更聰明的方式,但今天瀏覽大量文件後仍然沒有線索。命名參數多次傳遞

def bar(a=0, b=0, c=0, d=0): 
    print(a,b,c,d) 

def foo(b=0,d=0): 
    bar(d=d) 

foo(d=1) 
#(0,0,0,1) 
+2

在'foo'中,您正在調用'test()'。那應該是'bar()'? – MakPo

+1

也爲什麼dose'foo'有一個'b'參數,如果它沒有被使用? – MakPo

+0

抱歉錯別字...修正了它。 –

回答

0

我不認爲有這樣做的更好的辦法,但如果b參數不會在foo()被使用,那麼我不會有它在那裏。

def bar(a=0, b=0, c=0, d=0): 
    print(a,b,c,d) 

def foo(d=0): 
    bar(d=d) 

foo(1) 
#(0,0,0,1) 
0

任何這裏的答案是主觀的,但我不打算提交關閉的問題,因爲我覺得這是一個任何人學習Python和專業實踐價值。

說了那麼,我認爲你的方式是正確的,如果bfoo被假定爲在調用bar之後的函數中的一行代碼中被使用。如果不使用b,則應將其從參數列表中刪除。

但讓我再做一個案例,而我們是主觀性的:儘可能使用關鍵字參數在函數調用時指定參數

爲什麼?

因爲當你在專業環境中查看複雜的代碼時,它變得更加清楚傳遞給函數的原因和原因。在Python中,顯式優於隱式

您將編寫一次代碼。你可以糾正它幾次。有人會讀你的代碼來處理一千次的生產問題。

例如下面的代碼(這是一個財務模型)

採取:

def black_scholes(spot, strike, volatility, risk_free_rate, expiry=.25): 
    # do calculation and return result 
    # .... 
    return result 

option_value = black_scholes(44, 48, .08, .54, .75) 

將手放在函數定義的參數列表。你能分辨出每個數字代表什麼嗎? 當然,您可以在同一個文件中找到定義並比較位置參數,但如果black_scholes()在另一個模塊中呢?現在它有點強硬。如果我們擴大了這個範圍,並且在black_scholes()之間添加了更高級別的包裝,那麼我們需要調試才能達到這個目的?

現在,讓我告訴你有關鍵字參數的函數調用:

result = black_scholes(spot=44, strike=48, volatility=.08, risk_free_rate=.54, expiry=.75) 

現在,這變得更加清晰,我們可以預見期望的結果應該是什麼。我們還節省了大量的時間來閱讀代碼,並且將結果與調試器中的函數進行比較(與預期的結果相比),而不必進入並逐行閱讀。