真值评估无效的内置Python值是否存在?

时间:2014-08-15 16:04:54

标签: python boolean

我有一组子类,它们都应该定义一个属性x,它应该被评估为True或False。为了在忘记在子类中设置此值时捕获错误,我想在其超类中将其设置为真值评估导致错误的值。 Python有这种行为的内置值吗?我希望NotImplemented有这种行为,但它的评估结果为True

我可以将其设置为numpy.array([0, 0]) if x:提升ValueError,但这感觉不对。同样,我可以定义自己的类,其中__bool__引发异常。但是否有适合此目的的内置价值?

其他替代方案是set a property (abstract or not)或根本不定义(因此我们得到AttributeError)。

(我正在使用Python 3.4,以防万一)

2 个答案:

答案 0 :(得分:2)

我最近遇到了同样的问题,用例略有不同:

我有一个带有flag属性的类,其值由调用者传递给__init__。可以从两个不同版本的数据创建类的对象,其中旧版本的数据不包含确定标志是True False所需的信息。

将其他bool值设置为None(这是表示缺失数据的常用方法)不起作用,因为None很高兴评估为False

和你一样,我没有找到令人满意的内置解决方案,所以我自己写了一个。

(写于python2.7,但很容易调整python3)

class NotTrueNorFalseType(object):
    """
    A singleton class whose instance can be used in place of True or False, to represent
    a value which has no true-value nor false-value, e.g. a boolean flag the value of
    which is unknown or undefined.
    """
    def __new__(cls, *args, **kwargs):
        # singleton
        try:
            obj = cls._obj
        except AttributeError:
            obj = object.__new__(cls, *args, **kwargs)
            cls._obj = obj
        return obj

    def __nonzero__(self):
        raise TypeError('%s: Value is neither True nor False' % self)

    def __repr__(self):
        return 'NotTrueNorFalse'

NotTrueNorFalse = NotTrueNorFalseType()

本课程中的设计(min-)决策灵感来自None单例(例如命名单例实例“Foo”和类“FooType”,从__repr__返回“Foo”,在无效操作上提出TypeError

答案 1 :(得分:0)

将来,NotImplemented在布尔上下文中将无效。

从Python 3.9开始,不建议在布尔上下文中使用NotImplemented。来自the documentation

不建议在布尔上下文中评估NotImplemented。尽管当前评估为true,但它会发出DeprecationWarning。它将在未来的Python版本中引发TypeError

截至2020年10月6日,Python的未来版本(据我所知)尚未确定,但在将来的某个时候(我希望Python 3.11之前不会出现),{{1} }将成为内置Python值,其中真值评估无效。