在Python中如何检查一个对象是否为任何函数类型?

9 投票
4 回答
3343 浏览
提问于 2025-04-11 09:19

我在Python里有一个函数,它正在遍历通过dir(obj)得到的属性。我想检查这些属性中是否有任何是函数、方法、内置函数等等。通常你可以用callable()来检查,但我不想把类算进去。我目前想到的最好办法是:

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

有没有更可靠的方法来做这个检查呢?

编辑:我之前说错了,我说“通常你可以用callable()来检查,但我不想把类排除。”其实我确实想把类排除。我只想匹配函数,而不是类。

4 个回答

3
if hasattr(obj, '__call__'): pass

这也更符合Python的“鸭子类型”理念,因为你其实并不在乎它是什么,只要你能调用它就行。

值得注意的是,callable()这个功能在Python中将被移除,并且在3.0版本中是不存在的。

5

如果你想排除掉那些可能有__call__方法的类和其他随机对象,只检查函数和方法的话,可以使用inspect模块里的这三个函数。

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

这样做可以确保你的代码在未来也能正常工作。

17

inspect模块正好有你需要的功能:

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

撰写回答