Вы хотите проверить, действует ли какой-либо объект
в определенных обстоятельствах как число
Если вы используете Python 2.5 или более раннюю версию, единственным реальным способом являетсячтобы проверить некоторые из этих «определенных обстоятельств» и увидеть.
В версии 2.6 или выше, вы можете использовать isinstance
с числами. Число - существующий абстрактный базовый класс (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, например, например, ZeroDivisionError
или ValueError
& c) будут распространять исключения, но это нормально, пусть пользователь знает как можно скорее, что такие сумасшедшие типыпросто не приемлемы в хорошей компании ;-);но «вектор», который суммируется со скаляром (стандартная библиотека Python не имеет такового, но, конечно, они популярны как сторонние расширения), также дал бы неправильный результат, поэтому (например) эта проверка должна прийти после «не разрешено быть повторяемым» (например, проверьте, что iter(x)
повышает TypeError
, или на наличие специального метода __iter__
- если вы используете 2.5 или более раннюю версию и, таким образом,нужны ваши собственные проверки).
Краткого обзора таких сложностей может быть достаточно, чтобы мотивировать вас вместо этого полагаться на абстрактные базовые классы, когда это возможно ...; -).