2017-10-15 371 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

相关问题