7

我有一个东西清单,其中一些也可以是函数。如果它是一个函数,我想执行它。为此,我进行了类型检查。这通常适用于其他类型,如 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
>>>

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

4

4 回答 4

15

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

于 2013-07-12T10:21:51.060 回答
4

因为function不是内置类型,NameError所以引发了 a。如果要检查某物是否是函数,请使用hasattr

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

或者您可以使用isinstance()

>>> from collections import Callable
>>> isinstance(f, Callable)
True
>>> isinstance(map, Callable)
True
于 2013-07-12T10:21:27.693 回答
2

collections.Callable可以使用:

import collections

print isinstance(f, collections.Callable)
于 2013-07-12T10:37:12.827 回答
2
import types

if type(f) == types.FunctionType: 
    print 'It is a function!!'
于 2013-09-11T09:12:23.683 回答