如何创建返回标志对象

时间:2017-10-15 17:32:37

标签: python object flags

目前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等类似的对象。

2 个答案:

答案 0 :(得分:1)

您可以使用None0作为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