【问题标题】:How to check for a function type in Python?如何在 Python 中检查函数类型?
【发布时间】:2013-07-10 20:45:27
【问题描述】:

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

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

【问题讨论】:

  • 你也可以使用 try/except 代替检查类型。

标签: python function types


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    或者你可以使用isinstance():

    >>> from collections import Callable
    >>> isinstance(f, Callable)
    True
    >>> isinstance(map, Callable)
    True
    

    【讨论】:

    • isinstance 不适合 isinstance(map, types.FunctionType) 返回 False。内置函数是不同的,更不用说可调用的类了。
    • @zhangyangyu 内置函数可以使用inspect.isbuiltin
    • collections.Callable。它也适用于 buitlin 函数:isinstance(map, collections.Callable) 返回 True
    • @stalk - collections.Callable 和 simple callable 之间有什么区别(如 DanielRoseman 所建议)?
    • @kramer65 好吧,我认为这只是另一种解决方案。 callable() 看起来更简单。
    【解决方案3】:

    collections.Callable可以用:

    import collections
    
    print isinstance(f, collections.Callable)
    

    【讨论】:

    • 在新的 Python 3 版本中(我认为它是 3.2+)callable 被重新引入作为这个的简写。
    【解决方案4】:
    import types
    
    if type(f) == types.FunctionType: 
        print 'It is a function!!'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2017-05-15
      • 2023-03-08
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多