我有一个变量,x我想知道它是否指向一个函数。
x
我曾希望我可以做类似的事情:
>>> isinstance(x, function)
但这给了我:
Traceback (most recent call last): File "<stdin>", line 1, in ? NameError: name 'function' is not defined
我选择它的原因是因为
>>> type(x) <type 'function'>
如果这是针对 Python 2.x 或 Python 3.2+,您可以使用callable(). 它曾经被弃用,但现在已被弃用,因此您可以再次使用它。你可以在这里阅读讨论:http: //bugs.python.org/issue10518。你可以这样做:
callable()
callable(obj)
如果这是针对 Python 3.x 但在 3.2 之前的版本,请检查对象是否具有__call__属性。你可以这样做:
__call__
hasattr(obj, '__call__')
经常被建议的types.FunctionTypes或inspect.isfunction方法(两者都做完全相同的事情)带有许多警告。它False为非 Python 函数返回。例如,大多数内置函数False都是用 C 而不是 Python 实现的,因此它们返回:
types.FunctionTypes
inspect.isfunction
False
>>> isinstance(open, types.FunctionType) False >>> callable(open) True
所以types.FunctionType可能会给您带来令人惊讶的结果。检查鸭子类型对象属性的正确方法是询问它们是否嘎嘎,而不是查看它们是否适合鸭子大小的容器。
types.FunctionType