【问题标题】:Can I make Python throw exception when equal comparing different data types?当比较不同的数据类型时,我可以让 Python 抛出异常吗?
【发布时间】:2013-03-05 07:01:55
【问题描述】:

假设我想比较 2 个具有不同数据类型的变量:字符串和整数。我已经在 Python 2.7.3 和 Python 3.2.3 中对其进行了测试,并且都没有抛出异常。比较的结果是False。在这种情况下,我可以使用不同的选项配置或运行 Python 以引发异常吗?

ks@ks-P35-DS3P:~$ python2
Python 2.7.3 (default, Aug  1 2012, 05:14:39) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ python3
Python 3.2.3 (default, Apr 12 2012, 19:08:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> a="123"
>>> b=123
>>> a==b
False
>>> 
ks@ks-P35-DS3P:~$ 

【问题讨论】:

  • 您是否要为所有对象重载__eq__
  • 你真正想做的是什么?
  • @Burhan Khalid:我想保护自己免受无关类型的意外比较,并尽早了解它。
  • “不相关”类型不同于“不同”类型。你可能想澄清你的意思。例如,当您将 unicode 与 str 进行比较时,您是否想要异常?浮点数和整数呢?我认为添加这样的异常非常微妙,可能不会做你想要的。
  • 避免此类事故的最好方法是编写单元测试

标签: python exception types error-handling


【解决方案1】:

不,你不能。这些项目不相等,那里没有错误。

一般来说,unpythonic 强制你的代码只接受特定类型。如果您想创建int 的子类,并让它在int 工作的任何地方都可以工作怎么办? Python 布尔类型是 int 的子类,例如 (True == 1, False == 0)。

如果你必须有一个例外,你可以做以下两件事之一:

  1. 测试它们的类型是否相等并自己引发异常:

    if not isinstance(a, type(b)) and not isinstance(b, type(a)):
        raise TypeError('Not the same type')
    if a == b:
        # ...
    

    此示例允许 a 或 b 成为其他类型的子类,您需要根据需要缩小范围(type(a) is type(b) 非常严格)。

  2. 尝试订购类型:

    if not a < b and not a > b:
        # ...
    

    在 Python 3 中,将数值类型与序列类型(如字符串)进行比较时会引发异常。比较在 Python 2 中成功。

    Python 3 演示:

    >>> a, b = 1, '1'
    >>> not a < b and not a > b
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unorderable types: int() < str()
    >>> a, b = 1, 1
    >>> not a < b and not a > b
    True
    

【讨论】:

  • 您可以提到一个值得注意的 int 子类型,即布尔值。 (尽管 +1,很好的答案。)
  • 这里有同样的评论;你的 isinstance 检查不是对称的,这会使相等检查也不对称,这很奇怪。
  • @JesseRusak 不过这很容易解决。只需执行两个方向的检查即可。
  • @BlackVegetable 是的,但是如果您同时检查两个方向,如果其中一个失败(即两种类型必须相同)或两者都失败(即您还允许一种类型必须是子类型),您是否会抛出异常另一个)?这是有关此检查性质的关键点。
  • 好点。这是只有 OP 才能为我们回答的问题,因为他有特定的要求,我敢肯定。
【解决方案2】:

我想不出一种方法来完成它不会太丑陋而无法常规使用。这是 Python 程序员在没有语言帮助的情况下必须小心数据类型的一种情况。

感谢您没有使用数据类型在字符串和 int 之间静默强制转换的语言。

【讨论】:

    【解决方案3】:

    你可以定义一个函数来做到这一点:

    def isEqual(a, b):
        if not isinstance(a, type(b)): raise TypeError('a and b must be of same type')
        return a == b # only executed if an error is not raised
    

    【讨论】:

    • 现在不是对称的:isEqual(fooInstance, fooSubclassInstance) 会抛出异常,但 isEqual(fooSubclassInstance, fooInstance) 不会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-28
    • 2020-09-20
    • 2011-06-26
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-28
    相关资源
    最近更新 更多