我有一组子类,它们都应该定义一个属性x
,它应该被评估为True或False。为了在忘记在子类中设置此值时捕获错误,我想在其超类中将其设置为真值评估导致错误的值。 Python有这种行为的内置值吗?我希望NotImplemented
有这种行为,但它的评估结果为True
。
我可以将其设置为numpy.array([0, 0])
if x:
提升ValueError
,但这感觉不对。同样,我可以定义自己的类,其中__bool__
引发异常。但是否有适合此目的的内置价值?
其他替代方案是set a property (abstract or not)或根本不定义(因此我们得到AttributeError
)。
(我正在使用Python 3.4,以防万一)
答案 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值,其中真值评估无效。