Bạn muốn kiểm tra xem một số đối tượng
hoạt động giống như một số trong những trường hợp nhất định
Nếu bạn đang sử dụng Python 2.5 trở lên, cách thực sự duy nhất là kiểm tra một số "trường hợp nhất định" và xem.
Trong phiên bản 2.6 hoặc cao hơn, bạn có thể sử dụng isinstance
với các số. Số - một lớp cơ sở trừu tượng (ABC) tồn tại chính xác cho mục đích này (có nhiều ABC hơn tồn tại trong collections
mô-đun cho các dạng bộ sưu tập / vùng chứa khác nhau, bắt đầu lại bằng 2,6; và, cũng chỉ trong các bản phát hành đó, bạn có thể dễ dàng thêm các lớp cơ sở trừu tượng của riêng mình nếu cần).
Bach đến 2.5 trở về trước, "có thể thêm vào 0
và không thể lặp lại" có thể là một định nghĩa tốt trong một số trường hợp. Tuy nhiên, bạn thực sự cần phải tự hỏi bản thân rằng bạn đang hỏi điều gì mà bạn muốn coi là "một con số" chắc chắn phải làm được và những gì nó hoàn toàn không thể làm được - và kiểm tra.
Điều này cũng có thể cần thiết trong phiên bản 2.6 trở lên, có thể nhằm mục đích tạo đăng ký của riêng bạn để thêm các loại bạn quan tâm mà chưa được đăng ký numbers.Numbers
- nếu bạn muốn loại trừ một số loại cho rằng chúng là số nhưng bạn chỉ là không thể xử lý, điều đó thậm chí còn cần phải cẩn thận hơn, vì ABC không có unregister
phương pháp nào [[ví dụ: bạn có thể tạo ABC của riêng mình WeirdNum
và đăng ký ở đó tất cả các loại kỳ lạ dành cho bạn, sau đó trước tiên hãy kiểm tra isinstance
chúng để bảo lãnh trước khi bạn tiếp tục để kiểm tra isinstance
bình thường numbers.Number
để tiếp tục thành công.
BTW, nếu và khi bạn cần kiểm tra xem x
có thể hoặc không thể làm điều gì đó, bạn thường phải thử một cái gì đó như:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Sự hiện diện của "không được phép lặp lại" (ví dụ: kiểm tra tăng__add__
per se cho bạn biết không có gì hữu ích, vì ví dụ: tất cả các chuỗi đều có nó cho mục đích nối với các chuỗi khác. Việc kiểm tra này tương đương với định nghĩa "một số là một cái gì đó sao cho một chuỗi của những thứ như vậy là một đối số đơn hợp lệ cho hàm nội trang sum
", chẳng hạn. Các kiểu hoàn toàn kỳ lạ (ví dụ: những kiểu tăng ngoại lệ "sai" khi được tổng hợp thành 0, chẳng hạn như, giả sử, a ZeroDivisionError
hoặc ValueError
& c) sẽ phổ biến ngoại lệ, nhưng không sao, hãy cho người dùng biết càng sớm càng tốt rằng những kiểu điên rồ như vậy không được chấp nhận một cách tốt Công ty;-); nhưng, một "vectơ" có thể tổng hợp thành một đại lượng vô hướng (thư viện tiêu chuẩn của Python không có, nhưng tất nhiên chúng phổ biến như là phần mở rộng của bên thứ ba) cũng sẽ đưa ra kết quả sai ở đây, vì vậy (ví dụ:iter(x)
TypeError
hoặc cho sự hiện diện của phương thức đặc biệt __iter__
- nếu bạn đang ở 2.5 hoặc sớm hơn và do đó cần kiểm tra của riêng bạn).
Một cái nhìn thoáng qua về các biến chứng như vậy có thể đủ để thúc đẩy bạn thay vào đó dựa vào các lớp cơ sở trừu tượng bất cứ khi nào khả thi ... ;-).