2013-03-16 49 views
3

說我想比較2個變量與不同的數據類型:字符串和整數。我已經在Python 2.7.3和Python 3.2.3中對它進行了測試,並且不會引發異常。比較結果是False。在這種情況下,我可以使用不同的選項來配置或運行Python以引發異常嗎?當我比較不同的數據類型時,我可以讓Python拋出異常嗎?

[email protected]:~$ 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 
>>> 
[email protected]:~$ 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 
>>> 
[email protected]:~$ 
+4

你想爲所有對象重載'__eq__'嗎? – BlackVegetable 2013-03-16 16:10:26

+1

你究竟想要做什麼? – 2013-03-16 16:12:09

+0

@Burhan Khalid:我想保護自己免於意外比較不相關的類型,並儘可能早地瞭解它。 – ks1322 2013-03-16 16:15:04

回答

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 
+2

現在不是對稱的:'isEqual(fooInstance,fooSubclassInstance)'會拋出異常,但是'isEqual(fooSubclassInstance,fooInstance)'不會。 – 2013-03-16 16:12:51

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 
    
+0

你可以提到int,boolean的一個值得注意的子類型。 (+1雖然,很好的答案。) – BlackVegetable 2013-03-16 16:21:07

+0

在這裏相同的評論;你的isinstance檢查是不對稱的,這將使平等檢查也不對稱,這是非常奇怪的。 – 2013-03-16 16:21:49

+0

@JesseRusak雖然這很容易解決。只需執行兩個檢查方向。 – BlackVegetable 2013-03-16 16:22:46

1

我不能想辦法來完成它那會不會是太醜陋經常使用。這是Python程序員在沒有語言幫助的情況下必須小心數據類型的一種情況。

只要感激你沒有使用數據類型在字符串和int之間默默強制的語言。

相關問題