【问题标题】:Python object that evaluates to True when compared比较时计算结果为 True 的 Python 对象
【发布时间】:2015-05-28 12:06:40
【问题描述】:

我需要一个 Python 对象,当它与它进行比较时,它总是评估为 True。例如,如果这个对象被称为TRUE,那么:

TRUE == 10
TRUE == False
TRUE == True
TRUE == "hello"
TRUE == list()

是否有用于此的内置 Python 对象?

请注意,我要求的是内置对象。如果我要检查x == y 是否数百次,y 正在更改,x 是否被设置和取消设置,对于那些未设置的情况,我希望x == y 评估为True . (并且当设置x 时,我想要进行实际的比较操作)

我认为 python 可能为此有一个优化的内置对象。

【问题讨论】:

  • 否;为什么会有?通过实现__eq__,您可以轻松实现自己的目标。
  • 只是出于好奇,你为什么要这么做?
  • 如果您想要一个始终计算为True 的表达式,为什么不直接使用True
  • @JulienSprock:我正在编写一些研究代码。 TRUE 对象最终将被另一个对象的另一个实例替换,因此宣传这一点的一种方法是将TRUE 替换为None 并检查是否x is None。但是,如果您多次执行此检查,则会失去性能。
  • 我怀疑== 不是您真正应该在这里使用的谓词。

标签: python boolean boolean-expression


【解决方案1】:
class TRUE(object):
    def __eq__(self, other):
        return True
# no reason to have more that one instance (I think?)
TRUE = TRUE()

print(TRUE == 10)
print(TRUE == False)
print(TRUE == True)
print(TRUE == "hello")
print(TRUE == list())

附录: 正如其他人所指出的,TRUE 似乎没有明显的用途。我实在想不出一个。虽然我可以想象类似对象的用途:

class MIN(object):
    def __lt__(self, other): return True
    def __le__(self, other): return True
    def __gt__(self, other): return False
    def __ge__(self, other): return False
    def __eq__(self, other): return False
MIN = MIN()

如果我尝试测试最小堆,MIN 将始终位于顶部。对于最大堆,它总是在底部。这与队列中元素的类型无关。

【讨论】:

  • 将对象名称更改为类名以外的名称。
  • @MalikBrahimi 我是故意这样做的。没有理由拥有多个实例。
【解决方案2】:

您需要重载运算符,但这样做的意义何在?

class Custom:
    def __eq__(self, other):
        return True

【讨论】:

    【解决方案3】:

    我需要一个 python 对象,当它被比较时,它总是评估为 True。

    不,你没有。证明:假设存在这样的值 TRUE。那么表达式TRUE == x 等价于所有x 的True。因此整个表达式可以替换为True

    重载__eq__ 以使其简单地返回True 是不好的做法。

    如果您想要一个对于某个对象始终计算为 True 的表达式,也许这是一个更好的方法:

    class AlwaysTrue():
        pass
    
    l = [1,2,3,4,5,AlwaysTrue(),7,8,AlwaysTrue()]
    
    search_value = 6
    for x in l:
        if x == search_value or isinstance(x, AlwaysTrue):
            print('Value found!')
            break
    

    注意 6 不在列表中,但这仍然会打印“找到值!”

    【讨论】:

    • 是啊……这个问题真的很奇怪。
    • 您的证明假定表达式包含文字 TRUE。但是如果他在比较x == y呢?我同意这是一个奇怪的要求,但我不能肯定这样的东西永远不会有用。
    • @axblount 我添加了另一个建议,我认为这是一个更好的做法。
    • 这是一个TRUE 有用的例子:assert mytuple == (TRUE, 2) 这里,如果mytuple 的长度为 2 并且最后一个条目是 2,则断言为 True。在我看来assert mytuple == (TRUE, 2) 比例如更优雅。 len(mytuple)==2 and mytuple[-1]==2,虽然我更愿意称它为“ANY”而不是“TRUE”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    相关资源
    最近更新 更多