检查变量是否是 Python 中的函数

检查变量是否是 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()方法返回,否则返回。TrueFalse

主程序
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
但是,需要注意的重要一点是,该方法仅在提供 Python 函数时才返回。 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()
方法的工作方式相同。

然而,这个类有点间接,所以没有充分的理由使用它。

发表评论