2012-11-08 131 views
2

可能重複:
python - returning a default value使用無作爲參數傳遞給關鍵字參數

我在一個類的函數:

def foo(self, value = None): 
    if value is None: 
     return self.value 
    self.value = value 
    return self 

這是一個getter和setter組合合併爲一個,其優點是我可以鏈接如下功能:

three = anInstanceOfMyClass.foo(3).bar().foo() 

的問題時,我不喜歡這樣出現:

shouldBeNoneButIsThree = anInstanceOfMyClass.foo(3).foo(None).foo() 

這裏富認爲我沒有通過的說法。 我能避免這種情形:

  1. 設定值一些奇怪的物體,像一個隨機字符串
  2. 創建其價值具有作爲默認值的構造一個對象實例

似乎都有點工作太多,什麼是更簡單的方法?

設定值的東西

+0

我喜歡鏈接,因爲它可以將300行簡短的代碼更改爲100行,並具有相同或更高的可讀性。 –

+0

不錯的舉動,我寫了一個答案後刪除您的評論.. –

回答

6

您需要使用定點檢測到一個默認值未設置:

sentinel = object() 

def foo(self, value=sentinel): 
    if value is not sentinel: 
     print("You passed in something else!") 

這工作,因爲object()一個實例總是有它自己的內存ID和因此is只會返回True,如果確切的值留在原地。 其他任何值都不會註冊爲同一個對象,包括None

您會在各種不同的python項目中看到上述技巧的不同變體。以下任何哨兵也可以工作:

sentinel = [] 
sentinel = {} 
+1

複製你的答案從一個重複的問題是[勸阻](http://meta.stackexchange.com/questions/104227/is-it-acceptable-to-add -a重複的回答對幾家問題)。 – interjay

2

使用標記對象值是相當常見的;這是圖書館在做什麼abcoll.py

__marker = object() 

    def pop(self, key, default=__marker): 
     ... 
     if default is self.__marker: 

注意,定點對象應直接在類中定義。

相關問題