11

有没有一种很好的方法来检查 object o 是否是内置的 Python 函数?

我知道我可以使用,例如

type(o) == type(pow)

因为 type(pow) 是“builtin_function_or_method”。

但是有更好的方法吗?

4

6 回答 6

16

类型模块:

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

但是,如果您深入了解一下,您会发现它与您现在所做的并没有什么不同。

所以,在你的情况下,使用

isinstance(o, types.BuiltinFunctionType)
于 2012-09-10T08:15:13.187 回答
5

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

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

这是因为mathPython 中的模块由 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()
于 2016-08-07T10:55:20.297 回答
3

试试这个:

>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
>>> def a():
    pass
>>> isinstance(a, types.BuiltinFunctionType)
False
于 2012-09-10T08:17:56.570 回答
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
>>>
于 2012-09-10T08:19:21.577 回答
1

您可以检查内置函数是否将其作为属性并且可调用。样品:

>>> 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
于 2021-12-31T07:46:44.390 回答
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)

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

于 2019-04-08T18:34:50.923 回答