2010-11-16 65 views
0

我正在嘗試設置基於對象是否具有屬性的一些布爾:蟒蛇嘗試用相同的可能錯誤多個語句

try: 
    att1 = myobj.att1 
    att2 = myobj.att2 
    att3 = myobj.att3 
except AttributeError: 
    pass 

但是,如果att1不存在,拋出AttributeError,它贏得別試試其他兩個。我必須循環嗎(有沒有辦法做到這一點try聲明?)

謝謝!

回答

1

無需這裏try語句。例如:

myobj = 10 
names = ['att1', 'att2', 'att3', 'real'] 
results = dict((name, getattr(myobj, name, None)) for name in names) 
#{'real': 10, 'att3': None, 'att2': None, 'att1': None} 
+0

確實如此。我喜歡這個getattr函數。 – ash 2010-11-17 21:32:45

+0

很少有語言使得元編程像Python一樣簡單而乾淨。 – marr75 2010-11-18 19:33:59

0

您是否僅使用此來檢查某個對象是否具有屬性?如果是這樣,使用內置函數hasattr(事實上確實如你手動反正實現同樣的測試。


否則,您必須循環。

如果你仔細想想的結構代碼,你真正想要的是三個嘗試...除了塊 - 畢竟,如果異常返回到他們被處理後提出的地方,他們不會是非常特殊的!

這將是非常簡單的寫一個循環,但:

atts = [] 
for attr in ("att1", "att2", "att3"): 
    try: 
     attrs.append(getattr(myobj, attr)) 
    except AttributeError: 
     attrs.append[None] 
att1, att2, att3 = atts 

如果你真的想要的屬性與局部變量,你甚至可以這樣做:

for attr in ("att1", "att2", "att3"): 
    try: 
     locals()[attr] = getattr(myobj, attr) 
    except AttributeError: 
     pass 
+0

太棒了。我不是僅僅爲了存在而測試,所以我想我必須循環。感謝您的解釋。 – ash 2010-11-16 22:37:42

3

爲什麼不只是做:

your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3) 
0

考慮到存在2 * 2 * 2個可能的存在組合,爲什麼不設置?

set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr)) 
0

我認爲這也適用:

try: 
    (var1 and var2) 
except NameError: 
    ... 

它會在作出決定前測試所有的變量。