2016-02-23 13 views

Trả lời

11

Việc thực hiện python2 của hasattr khá ngây thơ, nó chỉ cố gắng truy cập thuộc tính đó và xem liệu nó đặt ra một ngoại lệ hay không.

Thật không may, điều này có nghĩa là mọi ngoại lệ chưa được giải quyết bên trong các thuộc tính sẽ bị nuốt và các lỗi trong mã đó có thể bị mất. Để thêm xúc phạm vào thương tích, khi hasattr ăn ngoại lệ, nó cũng sẽ trả về một câu trả lời sai (ở đây thuộc tính a.foohiện tồn tại, do đó kết quả phải trả về True nếu có).

Trong python3.2 +, hành vi đã được sửa chữa:

hasattr(object, name)

Các đối số là một đối tượng và một chuỗi. Kết quả là True nếu chuỗi là tên của một trong các thuộc tính của đối tượng, False nếu không. (Điều này được thực hiện bằng cách gọi getattr(object, name) và nhìn thấy cho dù đó đặt ra một AttributeError hay không.)

Việc sửa chữa là here, nhưng tiếc là sự thay đổi đó không backport.

Nếu hành vi python2 gây rắc rối cho bạn, hãy cân nhắc tránh sử dụng hasattr; thay vào đó, bạn có thể sử dụng thử/ngoại trừ khoảng getattr, chỉ bắt được ngoại lệ AttributeError và cho phép bất kỳ người nào khác không được giải quyết.

+4

Trích dẫn từ tài liệu Python mặc dù, hành vi 'hasattr' vẫn có thể được xem là lạ. Đúng là các ngoại lệ tùy ý bên trong một thuộc tính không còn khiến thuộc tính được coi là vắng mặt (nhưng thay vì được nâng lên ngay trong khuôn mặt của người gọi), nhưng nếu 'AttributeError' bắt nguồn từ đâu đó trong thuộc tính, kết quả của' hasattr' sẽ vẫn là 'Sai'. Điều này có thể không cố ý. (Hoặc nó có thể, do đó, một tài sản có thể xác định chính nó cho dù nó muốn được "có".) Trong mọi trường hợp, thực hiện bất động sản âm thanh sai với tôi ở nơi đầu tiên, xem xét tác dụng phụ vv –

+0

Không thực sự là một cách đơn giản để xác định liệu một 'AttributeError' được nâng lên bởi chính máy móc nhận thuộc tính hay bằng mã trong một thuộc tính. – kindall

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