python 3: how to check if an object is a function?
假设所有函数(内置的或用户定义的)都属于同一个类,但默认情况下该类似乎没有绑定到任何变量,这是正确的吗?
如何检查对象是否为函数?
我想我能做到:
1 2 3 4
| def is_function(x):
def tmp()
pass
return type(x) is type(tmp) |
它看起来不整洁,我甚至不能百分之百肯定它是完全正确的。
- 还有一些对象具有可作为函数调用的调用方法。
- 所有类都可以作为函数调用。
在Python 2:
在Python 3中:
1
| isinstance(fn, collections.Callable) |
由于Callable是一个抽象基类,因此它相当于:
- callable函数首先在python 3.0中被删除,然后在python3.2中被恢复,所以如果使用最新版本的解释器,您也可以使用它w/python3。有关详细信息,请参阅docs.python.org/3/library/…。
How can I check that an object is a function?
这和检查可调用文件不一样吗
1
| hasattr(object, '__call__') |
也在python 2.x中
1
| callable(object) == True |
- 它也适用于类,但是+1似乎更符合duck类型的逻辑
你可以做到:
1 2 3 4
| def is_function(x):
import types
return isinstance(x, types.FunctionType) \
or isinstance(x, types.BuiltinFunctionType) |
- 但这也检查它是否属于同一类吗?
- @版本,你说的if it is of the same class是什么意思?
- 类型对象上的is,yikes。如果必须使用显式类型检查,至少应使用isinstance(),最好要求inspect模块进行检查。
- 显式的"type(object)is sometype"很容易出错,很久以前就被isinstance所取代-学习新的和改进的编码习惯用法!
- @托马斯,@保罗,你说得对,回答更新了。谢谢你的提醒:)
- @保罗·麦奎尔:为什么type(object) is SomeType容易出错?(不是说我想用,但我很好奇)。
1 2 3 4
| try:
magicVariable()
except TypeError as e:
print( 'was no function' ) |
- -1,您不必执行函数来测试它。
- 我的代码不是用来测试的。当您有一个变量时,检查它是否是一个函数的唯一原因是您想要使用它。因此,您不应该事先花时间检查它,而应该将其作为函数使用并处理异常。
- 我之所以这样做,是因为在一般情况下,我认为你是对的,但在某些情况下,人们肯定想知道自己是否在处理一个函数而没有任何执行意图。元类和类修饰器浮现在脑海中。
- @不,这是一个原因。如果你想存储函数呢?如果使用此方法,则调试将更加困难。
- 如果函数引发类型错误,则此操作不起作用。
- @丹·沃特沃斯,我错过了。现在我希望我能撤销我的+1
- @丹·沃特沃斯:好吧,很公平,但在很多情况下,这仍然是一种可行的可能性。
- @aaronasterling:加入队列,我希望在人们发表评论后我能撤销很多投票。
- 当然,在某些情况下,这种方法是可行的,但我碰巧认为使用Callable或IsInstance更具可读性。
- 还有其他的原因让您想看看它是否是一个没有执行的函数,但是代码片段确实适用于许多用例。一个问题是,如果函数通过自身内部的类型错误,它将报告它不是函数。
- 如果函数至少接受一个参数,则不起作用,在这种情况下,调用零参数将导致单独的TypeError。
- 我喜欢把它作为EAFP/LBYL解决方案。OP需要检查,还是只是从失败中恢复?