【问题标题】:Broadly override an operator (Type check with "==")广泛覆盖运算符(使用“==”进行类型检查)
【发布时间】:2019-05-03 18:40:16
【问题描述】:

有没有办法让 Python (3.6.3) 在比较两个不同类型的对象时抛出错误?例如,我希望"2" == 2 抛出错误而不是返回False

天真地,我可以在条件中添加type(a) == type(b)a == b,但我希望有一个更简单的解决方案;比如用另一个符号替换==

在类似的情况下,我喜欢在 Python 中比较 strint 会导致类型不匹配错误。例如,"2" >= 2 会引发错误。但我正在为相等 == 寻找相同的行为。

PS:我想我有点误解了这个问题。准确地说,我正在寻找== 的简单替代方案,它会引发不同类型的错误;而不是广泛地覆盖 == 的行为。

【问题讨论】:

  • python如何知道你想抛出错误的类组合以及应该执行比较的类组合?您可能希望str int 失败,但是int float 呢?什么时候涉及到自定义类?
  • 我可以想象,如果您在全球范围内应用它,这也会破坏许多第三方依赖项。改变编程语言的基本行为不是一个好主意。
  • 感谢您的回复。一个愚蠢的问题,为什么不同的类型会导致>= 出现错误,而== 却不会?为什么两者之间的行为不一致?
  • @CHaworth,但== 不也存在这种歧义吗?
  • 这样想,当您检查两个对象 (a & b) 是否相等时,如果您检查 a ==b,则考虑将这两个对象都视为对象 a 的类型,或两者兼而有之如果您检查 b == a,则对象作为对象 b 的类型(不完全是它的工作原理,只是试图说明)。无论哪种方式,您都应该得到相同的结果。对于排序,您可能会发现当两者都被视为对象 a 的类型时 a > b 为真,而如果两者都被视为对象 b 的类型,则 a > b 为假(“10”>“9” vs 10 > 9 如果您尝试比较 "10" > 9)

标签: python python-3.x types operator-overloading


【解决方案1】:

这是一个相对简单的解决方案,但它确实需要您编辑所有现有的 == 使用。

改变这个:

if a == b:

到这里:

if isequal(a, b):

def isequal(a, b):
    assert type(a) == type(b)
    return a == b

【讨论】:

  • type(a)isinstance(a) 更好,因为后者会检查子类,而前者更严格。
猜你喜欢
  • 1970-01-01
  • 2019-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
  • 1970-01-01
  • 2012-09-09
相关资源
最近更新 更多