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

2024-04-25 07:09:58 发布

您现在位置:Python中文网/ 问答频道 /正文

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

例如,我知道我可以使用

type(o) == type(pow)

因为类型(pow)是“内置函数”或“方法”

但是有更好的方法吗


Tags: 对象方法函数类型type内置pow
3条回答

类型模块:

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

不过,如果你看看引擎盖下面,你会发现它和你现在所做的没什么不同

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

isinstance(o, types.BuiltinFunctionType)

试试这个:

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

这取决于你所说的“内置”是什么意思

使用__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()

相关问题 更多 >