Depende de lo que entendemos por “built-in”.
Usando __builtins__
Si desea comprobar que su función es una de las funciones incorporadas en el intérprete de Python puede utilizar
>>> pow in __builtins__.__dict__.values()
True
>>> __builtins__.__dict__['pow']
<built-in function pow>
El intérprete de Python tiene una serie de construida -en constantes, funciones, tipos y excepciones que se encuentran en el diccionario __builtins__.__dict__
.
Usando BuiltinFunctionType
Si por el contrario desea comprobar si su función es de tipo BuiltinFunctionType
puede utilizar el módulo de types
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
Usando inspect
O inspect.isbuiltin
(solo una envoltura alrededor de isinstance(object, types.BuiltinFunctionType)
)
>>> import inspect
>>> inspect.isbuiltin(pow)
True
Tenga en cuenta que el término “integrado” en BuiltinFunctionType
significa “escrito en C”.
Consideremos el siguiente ejemplo:
>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True
La función factorial
es de tipo BuiltinFunctionType
pero no es una función incorporada en el intérprete
>>> factorial in __builtins__.__dict__.values()
False
Esto es debido a que el módulo de math
en Python consiste en envoltorios alrededor de las funciones de la biblioteca matemática C.
Ser capaz de detectar un BuiltinFunctionType
es útil porque para las funciones escritas en Python se puede inspeccionar el código fuente sin tener que abrir los archivos fuente.
>>> 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()
Como @ iMom0 dijo en su respuesta - usted puede usar 'isinstance (x, y)' 'en lugar de utilizar el tipo (x) == Tipo (z)', yo creo que es más Pythonic :) – slallum
se Tienes razón, en qué estaba pensando. –
Esto no le dice si una función está incorporada, le dice si es una función C compilada de forma nativa. Los módulos de terceros con extensiones C también informarán sus funciones como este tipo. –