Вы хотите проверить, не
действует как число в определенных обстоятельствах
Если вы используете Python 2.5 или старше, единственный реальный способ - проверить некоторые из этих «определенных обстоятельств» и посмотреть.
В версии 2.6 или выше вы можете использовать isinstance
with 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 или более раннюю и, следовательно, нуждаетесь в собственных проверках).
Краткого ознакомления с такими сложностями может быть достаточно, чтобы мотивировать вас полагаться вместо этого на абстрактные базовые классы, когда это возможно ... ;-).