【问题标题】:python 3: how to check if an object is a function? [duplicate]python 3:如何检查一个对象是否是一个函数? [复制]
【发布时间】:2010-11-17 07:23:41
【问题描述】:

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

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

我猜我能做到:

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

它看起来并不整洁,我什至不能 100% 确定它是否完全正确。

【问题讨论】:

  • 还有可以作为函数调用的call方法的对象。
  • 所有类都可以作为函数调用。

标签: python class function python-3.x


【解决方案1】:

在python2中:

callable(fn)

在python3中:

isinstance(fn, collections.Callable)

由于 Callable 是一个抽象基类,这相当于:

hasattr(fn, '__call__')

【讨论】:

  • callable 函数首先在 Python 3.0 中被删除,然后在 Python 3.2 中被带回 - 因此,如果使用最新版本的解释器,您也可以在 Python 3 中使用它。请参阅docs.python.org/3/library/… 了解更多信息。
【解决方案2】:

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

这和检查可调用对象不一样

hasattr(object, '__call__')

在 python 2.x 中也是如此

callable(object) == True

【讨论】:

  • 它也适用于类,但无论如何 +1 似乎更符合鸭子打字的逻辑
【解决方案3】:

你可以这样做:

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

【讨论】:

  • 但这是否也检查它是否属于同一类?
  • @Version,if it is of the same class 是什么意思?
  • is 在类型对象上,哎呀。如果必须使用显式类型检查,至少使用isinstance(),最好让inspect 模块来代替。
  • Explicit "type(object) is SomeType" 很容易出错,很久以前就被isinstance 取代了——学习新的和改进的编码习惯!
  • @Thomas,@Paul,你是对的,答案已更新。感谢您的提醒:)
【解决方案4】:
try:
    magicVariable()
except TypeError as e:
    print( 'was no function' )

【讨论】:

  • -1,你不应该执行函数来测试它。
  • 我的代码并不是一个测试。当你有一个变量时,你检查它是否是一个函数的唯一原因是你想使用它。因此,与其花时间事先检查,不如将其用作函数并处理异常。
  • 我 +1 了它,因为在一般情况下,我认为你是对的,但在某些情况下,肯定有人想知道一个人是否正在处理一个函数而没有任何执行它的意图.想到元类和类装饰器。
  • @poke:不,这是原因之一。如果要存储功能怎么办?如果使用这种方法,调试起来会困难得多。
  • 如果函数引发 TypeError,这将不起作用。
猜你喜欢
  • 2023-01-13
  • 1970-01-01
  • 2011-06-07
  • 2017-07-26
  • 1970-01-01
  • 2019-07-18
  • 2015-10-12
  • 2011-11-19
相关资源
最近更新 更多