Принятый ответ был в то время, когда он был предложен, считался правильным. Как это
Оказывается, есть без замены для callable()
, который вернулся в Python
3.2: В частности, callable()
проверяет поле tp_call
объекта, являющегося объектом
испытания. Нет простого эквивалента Python. Большинство предлагаемых тестов
исправить большую часть времени:
>>> class Spam(object):
... def __call__(self):
... return 'OK'
>>> can_o_spam = Spam()
>>> can_o_spam()
'OK'
>>> callable(can_o_spam)
True
>>> hasattr(can_o_spam, '__call__')
True
>>> import collections
>>> isinstance(can_o_spam, collections.Callable)
True
Мы можем бросить гаечный ключ в это, удалив __call__
из
учебный класс. И просто чтобы сделать вещи более захватывающими, добавьте фальшивку __call__
к экземпляру!
>>> del Spam.__call__
>>> can_o_spam.__call__ = lambda *args: 'OK?'
Обратите внимание, это действительно не вызывается:
>>> can_o_spam()
Traceback (most recent call last):
...
TypeError: 'Spam' object is not callable
callable()
возвращает правильный результат:
>>> callable(can_o_spam)
False
Но hasattr
это неправильно :
>>> hasattr(can_o_spam, '__call__')
True
can_o_spam
имеет этот атрибут в конце концов; это просто не используется при звонке
экземпляр.
Еще тоньше, isinstance()
также ошибается:
>>> isinstance(can_o_spam, collections.Callable)
True
Поскольку мы использовали эту проверку раньше, а позже удалили метод, abc.ABCMeta
кеширует результат. Возможно, это ошибка в abc.ABCMeta
. Это сказало,
действительно нет никакого способа, которым мог бы дать более точный результат
результат, чем при использовании callable()
, так как typeobject->tp_call
Слот-метод недоступен другим способом.
Просто используйте callable()