在平等比较不同的数据类型时,我可以使Python抛出异常吗?

时间:2013-03-16 16:09:16

标签: python exception types error-handling

我想比较两个不同数据类型的变量:string和int。我在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:~$ 

3 个答案:

答案 0 :(得分:5)

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

一般来说,强制您的代码只接受特定类型是 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
    

答案 1 :(得分:1)

我无法想到一种方法来实现它,这种方式通常不会太难看。这是一个Python程序员在没有语言帮助的情况下必须小心数据类型的情况。

感谢你没有使用一种语言,其中数据类型在string和int之间被静默强制。

答案 2 :(得分:0)

您可以定义一个函数来执行此操作:

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