2008-09-16 56 views
6

我有一个函数在Python上迭代从dir(obj)返回的属性,我想检查是否有任何内部包含的对象是函数,方法,内置函数等。通常情况下,您可以为此使用callable(),但我不想包含类。到目前为止我所得到的最好的结果是:如果对象是任何函数类型,是否有一种常用的方法来检查Python?

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

有没有更具前瞻性的方法来做这个检查?

编辑:我之前说错了:“通常你可以使用callable(),但我不想取消资格。”我其实想要取消资格的类。我想匹配只有函数,而不是类。

回答

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)) 
2
if hasattr(obj, '__call__'): pass 

这也符合与Python的“鸭子类型”的理念更好,因为你并不真正关心什么是,只要你可以调用它。

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

+1

值得关注的是,它只对新型类的工作。对于旧式课程,你会得到False。 – 2008-09-16 16:28:48

5

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

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

这三个函数应该做你想做的事,未来方式。

+0

Upvoted,因为您可以在用户定义的类中定义__call__项,并且hasattr会高兴地告诉您该类具有__call__属性,即使它不是函数,您也可以选择使用hasattr解决方案。 – 2008-09-16 17:28:28

+0

我不明白这比我原来的评论中的解决方案更好吗?你仍然必须明确检查所有三个。 – 2008-09-16 17:49:08

1

根据你所说的 '阶级' 是什么:

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

或:

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

例如,结果是 '字典' 不同:

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