【问题标题】:How to create a return flag object如何创建返回标志对象
【发布时间】:2017-10-15 17:32:37
【问题描述】:

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

【问题讨论】:

  • 听起来像一个“tribool”...None 也是一个有效值还是可以用来表示没有结果?
  • 你不能只使用None吗? bool(None) == False
  • @endolith 好的...所以InvalidResult = None - 你完成了吗? :p
  • @endolith 您可以让无效结果引发异常。或者一个(成功,有效)元组。
  • 对此主题感兴趣的 PEP:PEP 661 -- Sentinel Values

标签: python object flags


【解决方案1】:

您可以只使用None0 作为InvalidResult 值,例如在my_mod,定义InvalidResult = None,然后你可以在其他地方测试if result is my_mod.InvalidResult。有关 None 的“真实性”的更多信息,请参见此处:False or None vs. None or False

或者您可以定义一个具有适合布尔转换方法的对象;希望其他人会加入这些细节。

请注意,无论您采用哪种方式,如果您有多部分布尔表达式,则必须小心:InvalidResult and False 将给出InvalidResult 但是False and InvalidResult 会给出False

【讨论】:

    【解决方案2】:

    显然这被称为“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

    【讨论】:

      猜你喜欢
      • 2014-07-07
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-12
      • 2019-09-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多