检查变量是否是 Python 中的函数
Check if a variable is a Function in Python
使用callable()
函数检查变量是否为函数,例如
if callable(function):
. 该callable()
函数接受一个对象,
True
如果该对象可调用则返回,否则False
返回。
def do_math(a, b): return a + b print(callable(do_math)) # 👉️ True print(callable('hello')) # 👉️ False if callable(do_math): # 👇️ this runs print('The variable is a function') else: print('The variable is NOT a function')
我们使用callable()
内置函数来检查变量是否是函数。
可调用
函数将一个对象作为参数,True
如果该对象看起来可调用则返回,否则False
返回。
print(callable(lambda x: x * 2)) # 👉️ True print(callable(3.14)) # 👉️ False
如果callable()
函数返回True
,调用对象仍有可能失败,但是,如果返回False
,调用对象将永远不会成功。
callable()
函数不会检查传入的值是否特定为函数,它会检查该值是否可调用。它还返回True
类。
class Employee: pass print(callable(Employee)) # 👉️ True print(callable(int)) # 👉️ True
另一种方法是使用inspect.isfunction()
方法。
使用 inspect.isfunction() 检查变量是否为函数
使用该inspect.isfunction()
方法检查变量是否为函数,例如if inspect.isfunction(function):
. 如果提供的对象是 Python 函数,则该inspect.isfunction()
方法返回,否则返回。True
False
import inspect def do_math(a, b): return a + b print(inspect.isfunction(do_math)) # 👉️ True if inspect.isfunction(do_math): # 👇️ this runs print('The variable is a function') else: print('The variable is NOT a function')
inspect.isfunction
方法接受一个对象,如果该对象是 Python 函数则返回。True
False
如果传递另一个可调用对象(例如类),该方法将返回。
import inspect class Employee: pass print(inspect.isfunction(Employee)) # 👉️ False print(inspect.isfunction(int)) # 👉️ False
True
该方法False
为大多数内置函数返回,因为它们是在 C 中实现的,而不是在 Python 中。
import inspect print(inspect.isfunction(zip)) # 👉️ False print(inspect.isfunction(map)) # 👉️ False print(callable(zip)) # 👉️ True print(callable(map)) # 👉️ True
zip
和函数是用C实现的map
,所以
inspect.isfunction()
方法返回False
。
callable
函数按预期工作,因为它只是检查提供的对象是否可调用。您还可以使用types.FunctionType
该类来检查变量是否为函数。
import types def do_math(a, b): return a + b print(isinstance(do_math, types.FunctionType)) # 👉️ True print(isinstance(zip, types.FunctionType)) # 👉️ False print(isinstance(map, types.FunctionType)) # 👉️ False
但是,该类也True
仅针对 Python 函数返回。
如果传入的对象是传入类的实例或子类,则isinstance
函数返回。True
该类types.FunctionType
的工作方式与该inspect.isfunction()
方法的工作方式相同。
然而,这个类有点间接,所以没有充分的理由使用它。