Есть ли общий способ проверить в Python, является ли объект каким-либо типом функции?

StackOverflow https://stackoverflow.com/questions/74092

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

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

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))

Другие советы

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

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

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

if hasattr(obj, '__call__'): pass

Это также лучше соответствует философии Python «утиной типизации», потому что вам все равно. что это так, пока вы можете это назвать.

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top