2012-01-17 62 views
8

請考慮簡單的函數:功能的相關預置參數

def fun(x, y, param1=10, param2=param1/3): 
    do something 

凡不應該要求param1param2,但可以由用戶設定。如果未設置param2,則值以某種方式取決於param1

上面的例子將提高NameError: name 'param1' is not defined

有沒有辦法做這樣的分配在Python?

回答

12

一種方法是模擬這種函數內:

def fun(x, y, param1=10, param2=None): 
    if param2 is None: 
     param2 = param1/3 
    # do something 

如果param2=None是一個有效的投入fun(),下面可能是一個更好的選擇:

default = object() 

def fun(x, y, param1=10, param2=default): 
    if param2 is default: 
     param2 = param1/3 
    # do something 

(已經在看這第二個例子幾分鐘,其實我很喜歡is default語法。)

原因orig inal版本不起作用的是在函數定義時計算和綁定默認值。這意味着你不能擁有一個默認值,這個默認值依賴於調用該函數之前不知道的東西(在你的情況下,值爲param1)。

+2

'default'可能會引起誤解,'not_set'可能是個更好的名字。對我來說一眼就不清楚,「default」不是默認值本身,而是一個佔位符,表明應該使用'param2'的默認值。 – jfs 2012-01-17 19:54:19