有没有一种很好的方法来检查 object o 是否是内置的 Python 函数?
我知道我可以使用,例如
type(o) == type(pow)
因为 type(pow) 是“builtin_function_or_method”。
但是有更好的方法吗?
有没有一种很好的方法来检查 object o 是否是内置的 Python 函数?
我知道我可以使用,例如
type(o) == type(pow)
因为 type(pow) 是“builtin_function_or_method”。
但是有更好的方法吗?
类型模块:
>>> import types
>>> types.BuiltinFunctionType
<type 'builtin_function_or_method'>
但是,如果您深入了解一下,您会发现它与您现在所做的并没有什么不同。
所以,在你的情况下,使用
isinstance(o, types.BuiltinFunctionType)
这取决于您所说的“内置”是什么意思。
使用__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
这是因为math
Python 中的模块由 C 数学库函数的包装器组成。
能够检测到 aBuiltinFunctionType
很有用,因为对于用 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()
试试这个:
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
>>> def a():
pass
>>> isinstance(a, types.BuiltinFunctionType)
False
你也可以
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
>>>
您可以检查内置函数是否将其作为属性并且可调用。样品:
>>> import builtins
>>> hasattr(builtins, 'max')
True
>>> hasattr(builtins, 'abs')
True
>>> hasattr(builtins, 'aaa')
False
>>> hasattr(builtins, 'True')
True
>>> callable(abs)
True
>>> callable(True)
False
>>> hasattr(builtins, 'max') and callable(max)
True
>>> hasattr(builtins, 'True') and callable(True)
False
尽管已经过去了一段时间,但也许其他人会发现我的答案很有用,因为我在寻找答案时突然出现了这个问题。
如果您只对测试感兴趣,而给定变量var
是以下之一:
function
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)
希望我的假设是正确的,但一般的想法是,如果我们得到 abuiltin_method
它必须有一个与之不None
相关的类型。