2010-10-01 93 views
8

Python documentationexcept說:爲什麼Python的`except`使用`isinstance`?

對於除了與 表達子句表達被 評價,該子句 異常,如果結果對象是 「兼容」與異常匹配。一個 對象是一個例外 如果它是類或基類異常對象的,[...]

爲什麼不except使用isinstance,而不是比較基類兼容?這阻止了使用__instancecheck__覆蓋實例檢查。

編輯:

我可以理解,這是不存在的原因之一是,沒有人認爲它。但是,有什麼理由不實施?

編輯:

在Python 3.2a的SSH會話顯示,嘗試使用__subclasscheck__爲這不起作用:

>>> class MyType(type): __subclasscheck__ = lambda cls, other_cls: True 
>>> class O(Exception, metaclass=MyType): pass 
>>> issubclass(3, O) 
0: True 
>>> issubclass(int, O) 
1: True 
>>> try: 
...  1/0 
... except O: 
...  print('Success') 
Traceback (most recent call last): 
    File "<pyshell#4>", line 2, in <module> 
    1/0 
ZeroDivisionError: division by zero 
>>> 

回答

3

答案很簡單,大概沒有人認爲它。更復雜的答案是沒有人會考慮它,因爲很難做到這一點,因爲這意味着在處理例外時執行潛在的任意Python代碼,並且它具有可疑價值。 Python中的異常類通常是非常簡單的類,並且通過功能重載它們往往是一個錯誤。很難想象有一個案例可以諮詢__instancecheck__。如果你有這種情況(有或沒有補丁),提交一個錯誤,有人可能會選擇它。

+1

我可以與沒人考慮過的事實聯繫起來。我想我要問的是,如果有充分的理由不這樣做。 *「這意味着在處理異常時執行潛在的任意Python代碼」*。我想我可以給予「同意的成年人」的答案 - 如果有人想在自己的異常處理中檢查自定義實例,爲什麼不讓他? – 2010-10-01 22:46:15

1

但是有什麼理由不應該實施這個 ?

你可以舉一個例子,這會有用嗎?

當你這樣做:

class SomeMeta(type): 
    def __subclasscheck__(cls, sub): 
     print (cls, sub) 
     return True 

class Something(Exception): 
    pass 

class SomeType(Exception): 
    __metaclass__ = SomeMeta 

try: 
    raise Something() 
except SomeType, e: 
    pass 

# prints (<class '__main__.SomeType'>, <class '__main__.Something'>) 

的Python上SomeType的元類調用__subclasscheck__,以確定是否SomethingSomeType一個子類。 Metaclass PEP更詳細地討論了這一點。

+0

我現在在2.6和3.2a上都試過你的'__subclasscheck__'建議,不幸的是它沒有工作。關於你的問題:你在「具體」中意味着什麼?這個例子有用嗎? – 2010-10-01 23:27:28

+0

@ cool-RR是的,我澄清了一下。 – 2010-10-01 23:38:49

+0

好的,我看到我們的兩個樣本都在2.6中工作,但在3.1或3.2a中沒有。 – 2010-10-01 23:48:46

相關問題