我在Python中有一个函数迭代从dir(obj)返回的属性,我想检查其中包含的任何对象是否是函数,方法,内置函数等。通常你可以使用callable(),但我不想包含类。我到目前为止所提出的最好的是:
isinstance(obj, (types.BuiltinFunctionType, types.FunctionType, types.MethodType))
是否有更具前瞻性的方法来进行此检查?
编辑:在我说:“通常你可以使用callable()之前我错过了,但我不想取消课程资格。”我实际上做想要取消课程资格。我想匹配仅函数,而不是类。
答案 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