目前a set of functions会返回success=True
或False
。
我们发现这还不够好,因为False
可以传达“有效结果”或“无效结果”,我们希望每种情况下的行为都不同。
So I think they should be changed而是返回{True, False, InvalidResult}
,其中bool(InvalidResult)
为false以便向后兼容,但可以使用if is InvalidResult
进行测试。
我不确定术语是什么,但我想象的是比较函数返回的built-in NotImplemented
之类的东西。这在文档中称为“特殊值”,类型为NotImplementedType
。
如何创建这样的对象以及它应该具有哪些方法/属性?我也应该创建自己的类型NotImplementedType
,或者是否存在传达这种“旗帜”概念的现有类型?它与True
,False
,None
,NotImplemented
等类似的对象。
答案 0 :(得分:1)
您可以使用None
或0
作为InvalidResult
值,例如在my_mod
中,定义InvalidResult = None
,然后在其他位置测试if result is my_mod.InvalidResult
。有关“无”False or None vs. None or False
或者您可以使用适当的布尔转换方法定义对象;希望其他人能够了解这些细节。
请注意,无论你采用哪种方式,如果你有多部分布尔表达式,你必须要小心:InvalidResult and False
会给InvalidResult
但是False and InvalidResult
会给False
。
答案 1 :(得分: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