在Python中如何检查一个对象是否为任何函数类型?
我在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))