2017-10-15 51 views
0

當前a set of functions返回success=TrueFalse如何創建返回標誌對象

雖然我們發現這還不夠好,因爲False既可以傳達「有效結果」也可以傳達「無效結果」,並且我們希望每種情況下的行爲都不相同。

So I think they should be changed改爲返回{True, False, InvalidResult},其中bool(InvalidResult)爲向後兼容性爲false,但可以使用if is InvalidResult進行測試。

我不確定這個術語是什麼,但我想象的是比較函數返回的built-in NotImplemented之類的東西。這在文檔中被稱爲「特殊值」,並且是NotImplementedType類型。

如何創建這樣的對象以及它應具有哪些方法/屬性?我也應該創建自己的類型,例如NotImplementedType,或者是否存在傳達此「標誌」概念的現有類型?這是一個類似的類的對象來TrueFalseNoneNotImplemented

+1

聽起來像一個「tribool」 ...是'None'也是一個有效的值或可能是被用來指沒有結果? –

+0

你不能使用None? BOOL(無)==假 – georgexsh

+0

@georgexsh是的,但認爲InvalidResult更清晰 – endolith

回答

1

你可以只使用None0InvalidResult值,例如在my_mod中,定義InvalidResult = None,然後在別處可以測試if result is my_mod.InvalidResult。請參閱此處查看有關「無」的更多信息:False or None vs. None or False

或者您可以使用合適的布爾轉換方法定義對象;希望其他人能與這些細節融合在一起。

注意,你去哪個方式,你必須要小心,如果你有多布爾表達式:InvalidResult and False會給InvalidResultFalse and InvalidResult會給False

1

顯然,這被稱爲 「sentinel」,是一種簡單,因爲這:

class InvalidResultType(object): 
    """ 
    Indicates that minimization has failed and result is invalid (such as a 
    boundary or constraint violation) 
    """ 
    def __repr__(self): 
     return 'InvalidResult' 
    def __bool__(self): 
     return False 
    def __reduce__(self): 
     return 'InvalidResult' 

InvalidResult = InvalidResultType() 


success = InvalidResult 

assert success == InvalidResult 
assert success is InvalidResult 
assert not bool(InvalidResult) 
assert InvalidResult != True 
assert InvalidResult != False # Not sure about this yet 
assert InvalidResult != None 

現在當然我發現類似的問題:

Defining my own None-like Python constant

__reduce__威力太過分了;我不知道,如果酸洗或複製將永遠事情

How to create a second None in Python? Making a singleton object where the id is always the same