有没有一种很好的方法可以检查对象o是否是内置的Python函数?
我知道我可以使用,例如
type(o) == type(pow)
因为type(pow)是'builtin_function_or_method'。
但是有更好的方法吗?
答案 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
。