第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Python中嵌套的try / except塊是一種好的編程習慣嗎?

Python中嵌套的try / except塊是一種好的編程習慣嗎?

繁華開滿天機 2021-03-09 13:15:07
我正在編寫自己的容器,該容器需要通過屬性調(diào)用來訪問內(nèi)部的字典。容器的典型用法是這樣的:dict_container = DictContainer()dict_container['foo'] = bar...print dict_container.foo我知道寫這樣的東西可能很愚蠢,但這就是我需要提供的功能。我正在考慮通過以下方式實現(xiàn)此目的:def __getattribute__(self, item):    try:        return object.__getattribute__(item)    except AttributeError:        try:            return self.dict[item]        except KeyError:            print "The object doesn't have such attribute"我不確定嵌套的try / except塊是否是一個好習慣,所以另一種方法是使用hasattr()and has_key():def __getattribute__(self, item):        if hasattr(self, item):            return object.__getattribute__(item)        else:            if self.dict.has_key(item):                return self.dict[item]            else:                raise AttributeError("some customised error")或使用其中之一并嘗試使用catch塊,如下所示:def __getattribute__(self, item):    if hasattr(self, item):        return object.__getattribute__(item)    else:        try:            return self.dict[item]        except KeyError:            raise AttributeError("some customised error")哪個選項最適合Pythonic和優(yōu)雅?
查看完整描述

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改用。


查看完整回答
反對 回復 2021-03-31
?
動漫人物

TA貢獻1815條經(jīng)驗 獲得超10個贊

雖然在Java中使用異常進行流控制確實是一個壞習慣(主要是因為異常迫使JVM收集資源(更多信息請參見此處)),但在Python中,您有兩個重要的原則:鴨子類型和EAFP?;旧希@意味著鼓勵您嘗試以您認為可行的方式使用對象,并在情況并非如此時進行處理。


總之,唯一的問題是您的代碼縮進過多。如果您愿意,請嘗試簡化一些嵌套,例如上面建議的答案中建議的lqc。


查看完整回答
反對 回復 2021-03-31
?
繁花不似錦

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


查看完整回答
反對 回復 2021-03-31
  • 4 回答
  • 0 關(guān)注
  • 248 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號