Ви хочете перевірити, чи є якийсь об’єкт
діє як число у певних обставинах
Якщо ви використовуєте Python 2.5 або новіші, єдиний реальний спосіб - перевірити деякі з цих "певних обставин" і побачити.
В 2.6 або вище, ви можете використовувати isinstance
з numbers.Number - це абстрактний базовий клас (ABC) , яка існує саме для цієї мети (існує багато більше ABCs в collections
модулі для різних форм колекцій / контейнерів, знову ж, починаючи з 2.6, і, також лише в цих випусках ви можете легко додати свої власні абстрактні базові класи, якщо вам потрібно).
Бах до 0
версії 2.5 і раніше "може бути доданий і не є ітерабельним", може бути хорошим визначенням у деяких випадках. Але вам справді потрібно запитати себе, що це таке, що ви запитуєте, що те, що ви хочете вважати "числом", безумовно, має бути в змозі зробити , а що воно абсолютно не може зробити - і перевірити.
Це також може знадобитися через 2.6 або пізнішої версії, можливо, для того, щоб зробити власні реєстрації, щоб додати важливі для вас типи, які ще не були зареєстровані numbers.Numbers
- якщо ви хочете виключити деякі типи, які стверджують, що вони номери, але ви просто не вдається впоратися, що вимагає ще більшої обережності, оскільки ABC не має unregister
методу [[наприклад, ви можете зробити свій власний ABC WeirdNum
і зареєструвати там усі такі дивні для вас типи, а потім спочатку перевірте, чи isinstance
не виходить це, перш ніж продовжувати щоб перевірити isinstance
нормальність, numbers.Number
щоб продовжувати успішно.
До речі, якщо і коли вам потрібно перевірити, чи x
можете чи не можете щось зробити, зазвичай вам потрібно спробувати щось на кшталт:
try: 0 + x
except TypeError: canadd=False
else: canadd=True
Присутність __add__
сама по собі не дає нічого корисного, оскільки, наприклад, всі послідовності мають це для об'єднання з іншими послідовностями. Ця перевірка еквівалентна визначенню "число є чимось таким, що послідовність таких речей є дійсним єдиним аргументом вбудованої функції sum
", наприклад. Цілком дивні типи (наприклад, ті, які підвищують "неправильний" виняток, коли їх підсумовують до 0, наприклад, a ZeroDivisionError
або ValueError
c), поширюватимуть виключення, але це нормально, нехай користувач знає якомога швидше, що такі божевільні типи просто не прийнятні компанія ;-); але "вектор", який підсумовується скаляру (стандартна бібліотека Python не має такого, але, звичайно, вони популярні як розширення сторонніх розробників), тут також дасть неправильний результат, так (наприклад,"не дозволено бути ітерабельним" (наприклад, перевірити, що iter(x)
підвищується TypeError
, або на наявність спеціального методу __iter__
- якщо ви перебуваєте у версії 2.5 чи раніше і тому потрібні ваші власні перевірки).
Короткий огляд таких ускладнень може бути достатнім, щоб спонукати вас покладатися на абстрактні базові класи, коли це можливо ... ;-).