Суть вопроса заключается в том, чтобы проверить, доступна ли какая-либо функция name в качестве метода.Поскольку типирование утки считается питоническим, должно быть простое
hasmethod(obj, 'some_method')
, но, похоже, нет.
Типизирование утки лучше всего сделать, просто попробовав:
try:
obj.some_method()
except:
# try something else
Если кто-то хочет, чтобы функция программно проверяла, есть ли у объекта метод с определенным именем переменной, то упоминалась следующая функция:
def hasmethod(obj, method_name):
return hasattr(obj, method_name) and callable(getattr(obj, method_name))
Но для Python 3 и 3.1 как минимумвам нужно вернуть callable (), который был удален.Обсуждение необходимости вернуть его можно найти в записи об ошибке в Python Воскрешение с возможностью вызова, например:
def callable(obj):
return isinstance(obj, collections.Callable)
Это прямо из вышеупомянутого отслеживания ошибок Python.Другие источники в стеке упоминают
callable = lambda o: hasattr(o, '__call__') or isinstance(o, collections.Callable)
, который добавляет hasattr к вызову.Оба отлично работают в моем случае использования
>>> bstr = b'spam'
>>> str = 'eggs'
>>> hasmethod(str, 'decode')
False
>>> hasmethod(bstr, 'decode')
True
Для более подробной информации посмотрите на уже процитированный другой вопрос