我正在嘗試設置基於對象是否具有屬性的一些布爾:蟒蛇嘗試用相同的可能錯誤多個語句
try:
att1 = myobj.att1
att2 = myobj.att2
att3 = myobj.att3
except AttributeError:
pass
但是,如果att1
不存在,拋出AttributeError
,它贏得別試試其他兩個。我必須循環嗎(有沒有辦法做到這一點try
聲明?)
謝謝!
我正在嘗試設置基於對象是否具有屬性的一些布爾:蟒蛇嘗試用相同的可能錯誤多個語句
try:
att1 = myobj.att1
att2 = myobj.att2
att3 = myobj.att3
except AttributeError:
pass
但是,如果att1
不存在,拋出AttributeError
,它贏得別試試其他兩個。我必須循環嗎(有沒有辦法做到這一點try
聲明?)
謝謝!
無需這裏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}
您是否僅使用此來檢查某個對象是否具有屬性?如果是這樣,使用內置函數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
太棒了。我不是僅僅爲了存在而測試,所以我想我必須循環。感謝您的解釋。 – ash 2010-11-16 22:37:42
爲什麼不只是做:
your_boolean = hasattr(obj, att1) or hasattr(obj, att2) or hasattr(obj, att3)
考慮到存在2 * 2 * 2個可能的存在組合,爲什麼不設置?
set(attr for attr in ('att%i' for i in range(1,4)) if obj.hasattr(attr))
我認爲這也適用:
try:
(var1 and var2)
except NameError:
...
它會在作出決定前測試所有的變量。
確實如此。我喜歡這個getattr函數。 – ash 2010-11-17 21:32:45
很少有語言使得元編程像Python一樣簡單而乾淨。 – marr75 2010-11-18 19:33:59