2014-01-09 19 views
0

請幫我在這簡單的問題Python中忽略的字典值時,整數變量被選中

x=1 
if x["status"] == "Error": 
    print "Fine" 
elif x == 1: 
    print "Good 

    Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    TypeError: 'int' object has no attribute '__getitem__' 

x是它可以是整數或字典的函數返回值。我不希望我的IF條件提醒我,如果它反之亦然。

回答

5

一個顯而易見的解決方案是稍微修改當前的代碼來處理錯誤:

try: 
    if x["status"] == "Error": 
     print "Fine" 
except TypeError: 
    if x == 1: 
     print "Good" 

另一種選擇是明確檢查是否xintdict

if isinstance(x, dict) and x["status"] == "Error": 
    print "Fine" 
elif isinstance(x, int) and x == 1: 
    print "Good" 

雖然這種刪除某些Python的鴨類型的好處;對於第一個版本,例如,如果提供x的功能返回floatx = 1.0),它仍然有效。

0

您可以使用isinstance來檢查x是否爲字典。

if isinstance(x, dict) and x["status"] == "Error": 
    print "Fine" 
elif x == 1: 
    print "Good 

但是,更好的是,我寧願改變函數返回一種類型。

0

使用類型(x)的== INT檢查它是否是一個int

使用類型(x)的==字典來檢查它是否是一個字典

然後採取適當的行動

+0

將'isinstance'設置爲'type':http://stackoverflow.com/questions/1549801/differences-between-isinstance-and-type-in​​-python – jonrsharpe

0

它最靈活使用鴨打字:上述

if x == 1: 
    print("Good") 
elif hasattr(x, '__getitem__') and x["status"] == "Error": 
    print("Fine") 

接受任何x是整數或字典。爲了檢查字典中項目的值,需要一個_getitem__方法和上面的檢查,而不是更多。

鴨子輸入有兩個原因:一個是用戶可以創建自己的類並期望您的代碼與它們一起工作。另一個是官方的Python類可能會改變。例如,後者,隨着蟒蛇2→3的過渡而發生。舊代碼可能使用isinstance(x,unicode)將在python3下失敗,而使用鴨編碼的代碼可能會存活。