2010-11-17 178 views
9

我是否正确假设所有函数(内置或用户定义的)属于同一个类,但该类默认情况下似乎没有绑定到任何变量?python 3:如何检查一个对象是否是一个函数?

如何检查对象是否是函数?

我能做到这一点,我想:

def is_function(x): 
    def tmp() 
    pass 
    return type(x) is type(tmp) 

这似乎并不整齐,而且我甚至100%肯定它是完全正确的。

+2

另外还有与__call__方法,该方法可以被称为一个函数对象。 – SiggyF 2010-11-17 07:30:10

+1

所有类都可以作为函数调用。 – PaulMcG 2010-11-17 09:49:44

回答

14

在python2:

callable(fn) 

在python3 :

isinstance(fn, collections.Callable) 

作为可赎回是一个抽象基类,这相当于:

hasattr(fn, '__call__') 
+3

'可调用函数'首先在Python 3.0中被移除,然后被带回到Python 3.2中 - 所以如果使用最新版本的解释器,你也可以使用它。有关更多信息,请参阅http://docs.python.org/3/library/functions.html?highlight=callable#callable。 – 2013-11-18 14:46:42

1

你可以这样做:

def is_function(x): 
    import types 
    return isinstance(x, types.FunctionType) \ 
     or isinstance(x, types.BuiltinFunctionType) 
+0

但这是否也检查它是否属于同一类? – 2010-11-17 07:29:00

+0

@Version,如果它属于同一类,那你是什么意思? – 2010-11-17 07:31:08

+0

对于类型的对象,是''是''。如果你必须使用明确的类型检查,至少应该使用'isinstance()',并且最好让'inspect'模块去做。 – 2010-11-17 08:50:23

4

我如何检查的对象是一个功能?

这难道不是一样可调用

检查
hasattr(object, '__call__') 

,并在Python 2.x的

callable(object) == True 
+1

它也适用于类,但+1无论如何,它似乎更多的在鸭打字 – kriss 2010-11-17 07:28:55

-2
try: 
    magicVariable() 
except TypeError as e: 
    print('was no function') 
+3

-1的逻辑,你不应该执行函数来测试它。 – 2010-11-17 08:24:09

+4

我的代码不是作为*测试*。当你有一个变量时,你检查它是否是函数的唯一原因是你想使用它。因此,不要花时间检查,而应该将其用作函数并处理异常。 – poke 2010-11-17 08:26:12

+1

我为它+1了,因为在一般情况下,我认为你是对的,但肯定会有人想知道是否有人正在处理一个函数而没有执行它的意图。元类和类装饰器浮现在脑海。 – aaronasterling 2010-11-17 08:31:16

相关问题