Вы хотите проверить, не
действует как число в определенных обстоятельствах
Если вы используете Python 2.5 или старше, единственный реальный способ - проверить некоторые из этих «определенных обстоятельств» и посмотреть.
В версии 2.6 или выше вы можете использовать isinstancewith numbers.Number - абстрактный базовый класс (ABC), который существует именно для этой цели (в collectionsмодуле существует гораздо больше ABC для различных форм коллекций / контейнеров, опять же, начиная с версии 2.6; и, также только в этих выпусках вы можете легко добавить свои собственные абстрактные базовые классы, если вам нужно).
Баха до 2.5 и ранее, «можно добавить 0и не повторять» может быть хорошим определением в некоторых случаях. Но вам действительно нужно спросить себя, что именно вы спрашиваете, что то, что вы хотите считать «числом», обязательно должно уметь делать , а что оно должно быть абсолютно неспособным - и проверьте.
Это также может потребоваться в версии 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 или более раннюю и, следовательно, нуждаетесь в собственных проверках).
Краткого ознакомления с такими сложностями может быть достаточно, чтобы мотивировать вас полагаться вместо этого на абстрактные базовые классы, когда это возможно ... ;-).