Как указать для проверки в isinstance() тип объекта "function"?

Возникла необходимость использовать isinstance() для функции. Но не все оказалось просто.

def foo():
    ...

  
def bar(d):
    return d    

isinstance(foo, type(bar))

Работает правильно и возвращает True. Однако зарезервированного слова для function нет. И при попытке написать что то типа

isinstance(foo, function)

Мы получаем ошибку, несмотря на то, что

type(bar)  

function

Хотя я и привел выше работающий вариант кода, я воспринимаю его как "костыль". Как говорят гранды - "Должен быть способ лучше!" )


Ответы (1 шт):

Автор решения: Vasyl Kolomiets

Здесь нашел ответ.

from types import BuiltinFunctionType, BuiltinMethodType,  FunctionType, MethodType, LambdaType
from functools import partial

def is_function(obj):
  return isinstance(obj, (BuiltinFunctionType, 
BuiltinMethodType,  FunctionType, MethodType, LambdaType, partial))

#-------------------------------------------------

def my_func():
  pass

def add_both(x, y):
  return x + y

class a:
  def b(self):
    pass

check = [

is_function(lambda x: x + x),
is_function(my_func),
is_function(a.b),
is_function(partial),
is_function(partial(add_both, 2))

]

print(check)
>>> [True, True, True, False, True]

Вот уж не знал, что в Python столько разных типов для того, что я ощущал под одним словом "функция".

→ Ссылка