4 回答

TA貢獻1789條經(jīng)驗 獲得超8個贊
您的第一個示例非常好。甚至官方的Python文檔也推薦這種稱為EAFP的樣式。
就個人而言,我寧愿避免在不必要時嵌套:
def __getattribute__(self, item):
try:
return object.__getattribute__(item)
except AttributeError:
pass # Fallback to dict
try:
return self.dict[item]
except KeyError:
raise AttributeError("The object doesn't have such attribute") from None
PS。has_key()已在Python 2中棄用了很長時間。請item in self.dict改用。

TA貢獻1815條經(jīng)驗 獲得超10個贊
雖然在Java中使用異常進行流控制確實是一個壞習慣(主要是因為異常迫使JVM收集資源(更多信息請參見此處)),但在Python中,您有兩個重要的原則:鴨子類型和EAFP?;旧希@意味著鼓勵您嘗試以您認為可行的方式使用對象,并在情況并非如此時進行處理。
總之,唯一的問題是您的代碼縮進過多。如果您愿意,請嘗試簡化一些嵌套,例如上面建議的答案中建議的lqc。

TA貢獻1851條經(jīng)驗 獲得超4個贊
請小心-在這種情況下,第一個finally被觸摸,但也被跳過。
def a(z):
try:
100/z
except ZeroDivisionError:
try:
print('x')
finally:
return 42
finally:
return 1
In [1]: a(0)
x
Out[1]: 1
添加回答
舉報