如果对象是任何函数类型,是否有一种常见的方法来检查Python?

时间:2008-09-16 16:13:10

标签: python types

我在Python中有一个函数迭代从dir(obj)返回的属性,我想检查其中包含的任何对象是否是函数,方法,内置函数等。通常你可以使用callable(),但我不想包含类。我到目前为止所提出的最好的是:

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

是否有更具前瞻性的方法来进行此检查?

编辑:在我说:“通常你可以使用callable()之前我错过了,但我不想取消课程资格。”我实际上想要取消课程资格。我想匹配函数,而不是类。

4 个答案:

答案 0 :(得分:13)

检查模块完全符合您的要求:

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

答案 1 :(得分:5)

如果要排除可能具有__call__方法的类和其他随机对象,并且只检查函数和方法,inspect module

中的这三个函数
inspect.isfunction(obj)
inspect.isbuiltin(obj)
inspect.ismethod(obj)

应该以面向未来的方式做你想做的事。

答案 2 :(得分:2)

if hasattr(obj, '__call__'): pass

这也适用于Python的“鸭子打字”理念,因为你并不真正关心它是什么,只要你可以调用它。

值得注意的是,callable()正在从Python中删除,并且不存在于3.0中。

答案 3 :(得分:1)

取决于“课堂”的含义:

callable( obj ) and not inspect.isclass( obj )

或:

callable( obj ) and not isinstance( obj, types.ClassType )

例如,'dict'的结果不同:

>>> callable( dict ) and not inspect.isclass( dict )
False
>>> callable( dict ) and not isinstance( dict, types.ClassType )
True