如何在Python中检查函数类型?

13

我有一个事物列表,其中一些也可以是函数。如果它是一个函数,我想执行它。为此,我进行类型检查。这通常适用于其他类型,例如str、int或float。但对于函数似乎不起作用:

>>> def f():
...     pass
... 
>>> type(f)
<type 'function'>
>>> if type(f) == function: print 'It is a function!!'
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'function' is not defined
>>>

有人知道我如何检查函数类型吗?


你也可以使用try/except代替类型检查。 - Paulo Almeida
4个回答

19

不要检查类型,检查行为。你实际上并不关心它是一个函数(例如它可能是一个带有__call__方法的类实例),你只关心它是否可以被调用。因此,请使用callable(f)


4
import types

if type(f) == types.FunctionType: 
    print 'It is a function!!'

4

由于function不是内置类型,因此会引发NameError错误。如果您想检查某个东西是否为函数,请使用hasattr

>>> hasattr(f, '__call__')
True

或者您可以使用isinstance()函数:

>>> from collections import Callable
>>> isinstance(f, Callable)
True
>>> isinstance(map, Callable)
True

isinstance 不适用于 isinstance(map, types.FunctionType) 返回 False。内置函数是不同的,更不用说可调用类了。 - zhangyangyu
1
有一个名为collections.Callable的函数。它也适用于内置函数:isinstance(map, collections.Callable)返回True - stalk
@kramer65,我认为这只是另一种解决方案。callable()看起来更简单。 - stalk
@kramer65 我做了一些研究,看起来callable被认为是过时的,并且实际上在Python 3.0中被删除,因为建议使用collections.Callable。然而,在3.1中又被重新加入了。 - TerryA
@kramer65 callable 是一个内置函数。collections.Callable为提供了__call__() 方法的类提供抽象基类。我不认为有任何理由为此目的使用后者。 - Paulo Almeida
显示剩余2条评论

3

在相对较新的 Python 3 版本中(我认为是 3.2+),callable 被重新引入作为这个的简写。 - user395760

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接