Python - 测试对象是否是内置函数

时间:2012-09-10 08:13:00

标签: python

有没有一种很好的方法可以检查对象o是否是内置的Python函数?

我知道我可以使用,例如

type(o) == type(pow)

因为type(pow)是'builtin_function_or_method'。

但是有更好的方法吗?

5 个答案:

答案 0 :(得分:9)

类型模块:

>>> import types
>>> types.BuiltinFunctionType
<type 'builtin_function_or_method'>

但是,如果你仔细观察,你会发现它与你现在所做的并没有什么不同。

因此,在您的情况下,请使用

isinstance(o, types.BuiltinFunctionType)

答案 1 :(得分:3)

试试这个:

>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
>>> def a():
    pass
>>> isinstance(a, types.BuiltinFunctionType)
False

答案 2 :(得分:2)

你也可以

import __builtin__
o in __builtin__.__dict__.values()

或者,在CPython中:

o in __builtins__.__dict__.values()

但请注意,您依赖于此处的实施细节。


>>> pow in __builtins__.__dict__.values()
True
>>> def a():
...   pass
...
>>> a in __builtins__.__dict__.values()
False
>>>

答案 3 :(得分:2)

这取决于“内置”的含义。

使用__builtins__

如果你想检查你的函数是Python解释器中的内置函数之一,你可以使用

>>> pow in __builtins__.__dict__.values()
True
>>> __builtins__.__dict__['pow']
<built-in function pow>

Python解释器有许多内置常量,函数,类型和异常,它们包含在字典__builtins__.__dict__中。

使用BuiltinFunctionType

另一方面,如果您想检查您的函数是否为BuiltinFunctionType类型,则可以使用types模块

>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True

使用inspect

inspect.isbuiltin(只是isinstance(object, types.BuiltinFunctionType)的包装)

>>> import inspect
>>> inspect.isbuiltin(pow)
True

请注意,BuiltinFunctionType中的“内置”一词的意思是“用C语言编写”。

考虑以下示例:

>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True

factorial函数属于BuiltinFunctionType类型,但它不是解释器中的内置函数

>>> factorial in __builtins__.__dict__.values()
False

这是因为Python中的math模块包含C数学库函数的包装。

能够检测BuiltinFunctionType是有用的,因为对于用Python编写的函数,可以检查源代码而无需打开源文件。

>>> import random
>>> isinstance(random.random, types.BuiltinFunctionType)
True
>>> inspect.getsource(random.random)
# returns TypeError
>>> isinstance(random.uniform, types.BuiltinFunctionType)
False
>>> from __future__ import print_function # if using Python 2.*
>>> print(inspect.getsource(random.uniform))
    def uniform(self, a, b):
        "Get a random number in the range [a, b) or [a, b] depending on rounding."
        return a + (b-a) * self.random()

答案 4 :(得分:0)

尽管已经过去了一段时间,但也许其他人会发现我的答案很有用,因为这个问题在我寻找答案的过程中突然出现了。

如果您只对测试感兴趣,则给定变量var是以下之一:
1. function
2. builtin_function_or_method而非method

我发现以下测试有效:

import types
def is_func(arg): return isinstance(arg, types.FunctionType) or \ (isinstance(arg, types.BuiltinFunctionType) and arg.__self__ is None)

希望我的假设是正确的,但是一般的想法是,如果给我们一个builtin_method,它必须具有与之不相关的类型None