Есть ли общий способ проверить в Python, является ли объект какого-либо типа функции? - PullRequest
6 голосов
/ 16 сентября 2008

У меня есть функция в Python, которая перебирает атрибуты, возвращаемые из dir (obj), и я хочу проверить, является ли какой-либо из объектов, содержащихся внутри, функцией, методом, встроенной функцией и т. Д. Обычно вы можете использовать callable () для этого, но я не хочу включать классы. Лучшее, что я придумала до сих пор:

isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))

Есть ли более вероятный способ сделать эту проверку?

Редактировать: Я неправильно говорил раньше, когда говорил: «Обычно вы можете использовать callable () для этого, но я не хочу дисквалифицировать классы». Я на самом деле делаю хочу дисквалифицировать классы. Я хочу сопоставить только функции, а не классы.

Ответы [ 4 ]

13 голосов
/ 16 сентября 2008

Модуль проверки имеет именно то, что вы хотите:

inspect.isroutine( obj )

К вашему сведению, код:

def isroutine(object):
    """Return true if the object is any kind of function or method."""
    return (isbuiltin(object)
            or isfunction(object)
            or ismethod(object)
            or ismethoddescriptor(object))
5 голосов
/ 16 сентября 2008

Если вы хотите исключить классы и другие случайные объекты, которые могут иметь метод __call__, и проверять только функции и методы, эти три функции в модуле inspect

inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)

должен делать то, что вы хотите в будущем.

2 голосов
/ 16 сентября 2008
if hasattr(obj, '__call__'): pass

Это также лучше согласуется с философией Python по "утиной печати", потому что вас не волнует что это такое , если вы можете это назвать.

Стоит отметить, что callable() удаляется из Python и отсутствует в 3.0.

1 голос
/ 16 сентября 2008

В зависимости от того, что вы подразумеваете под «классом»:

callable( obj ) and not inspect.isclass( obj )

или

callable( obj ) and not isinstance( obj, types.ClassType )

Например, результаты для 'dict' отличаются:

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...