Ви хочете перевірити, чи є якийсь об’єкт
діє як число у певних обставинах
Якщо ви використовуєте 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або ValueErrorc), поширюватимуть виключення, але це нормально, нехай користувач знає якомога швидше, що такі божевільні типи просто не прийнятні компанія ;-); але "вектор", який підсумовується скаляру (стандартна бібліотека Python не має такого, але, звичайно, вони популярні як розширення сторонніх розробників), тут також дасть неправильний результат, так (наприклад,"не дозволено бути ітерабельним" (наприклад, перевірити, що iter(x)підвищується TypeError, або на наявність спеціального методу __iter__- якщо ви перебуваєте у версії 2.5 чи раніше і тому потрібні ваші власні перевірки).
Короткий огляд таких ускладнень може бути достатнім, щоб спонукати вас покладатися на абстрактні базові класи, коли це можливо ... ;-).