2010-10-01 38 views
8

Các Python documentation cho except nói:Tại sao không sử dụng `except` của Python là` isinstance`?

Đối với một vế except với một biểu , biểu hiện đó là đánh giá, và các điều khoản phù hợp với ngoại lệ nếu đối tượng kết quả là “tương thích” với ngoại lệ. Một đối tượng tương thích với một ngoại lệ nếu nó là lớp hoặc một lớp cơ sở của đối tượng ngoại lệ, [...]

Tại sao không sử dụng exceptisinstance thay vì so sánh các lớp học cơ sở? Điều này ngăn cản việc sử dụng __instancecheck__ để ghi đè kiểm tra cá thể.

EDIT:

tôi có thể hiểu rằng một trong những lý do này không tồn tại là không ai coi nó. Nhưng có bất kỳ lý do tại sao điều này không nên được thực hiện?

EDIT:

Shell phiên từ Python 3.2a cho thấy cố gắng sử dụng __subclasscheck__ cho điều này không làm việc:

>>> 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 
>>> 

Trả lời

3

Câu trả lời đơn giản là có thể mà không ai coi nó. Một câu trả lời phức tạp hơn sẽ là không ai coi nó bởi vì thật khó để có được quyền này, bởi vì nó có nghĩa là thực thi mã Python có khả năng tùy ý trong khi xử lý một ngoại lệ và nó có giá trị không rõ ràng. Các lớp ngoại lệ trong Python thường là các lớp rất đơn giản và quá tải chúng với chức năng thường là một sai lầm. Thật khó để tưởng tượng một trường hợp có nó tham khảo __instancecheck__. Nếu bạn có trường hợp như vậy (có hoặc không có bản vá), hãy gửi một lỗi và ai đó có thể nhặt nó.

+1

Tôi có thể liên hệ với thực tế là không ai coi nó. Tôi đoán những gì tôi yêu cầu là nếu có lý do chính đáng để không làm điều đó. * "nó có nghĩa là thực thi mã Python có khả năng tùy ý trong khi xử lý một ngoại lệ" *. Tôi nghĩ rằng tôi có thể đưa ra câu trả lời "người lớn đồng ý" cho điều đó-- Nếu ai đó muốn có một kiểm tra cá thể tùy chỉnh trong xử lý ngoại lệ của mình, tại sao không để cho anh ta? –

1

Nhưng có bất kỳ lý do nào tại sao không nên triển khai này?

Bạn có thể đưa ra ví dụ về điều này hữu ích không?

Khi bạn làm điều này:

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 gọi __subclasscheck__ trên metaclass SomeType 's để xác định xem Something một lớp con của SomeType. Số Metaclass PEP nói về điều này chi tiết hơn.

+0

Tôi đã thử đề xuất '__subclasscheck__' của bạn ngay bây giờ trên cả 2.6 và 3.2a, tiếc là nó không hoạt động. Về câu hỏi của bạn: Bạn có ý nghĩa gì trong "bê tông"? Một ví dụ cho điều này là hữu ích? –

+0

@ cool-RR yeah, tôi đã làm rõ một chút. –

+0

Được rồi, tôi thấy rằng cả hai mẫu của chúng tôi đều hoạt động ở 2.6, nhưng không hoạt động ở phiên bản 3.1 hoặc 3.2a. –

Các vấn đề liên quan