Dipende cosa si intende per “built-in”.
Utilizzando __builtins__
Se si desidera controllare che la funzione è una delle funzioni incorporate in Python è possibile utilizzare
>>> pow in __builtins__.__dict__.values()
True
>>> __builtins__.__dict__['pow']
<built-in function pow>
L'interprete Python ha un numero di built -in costanti, funzioni, tipi ed eccezioni, che sono contenute nel dizionario __builtins__.__dict__
.
Utilizzando BuiltinFunctionType
Se d'altra parte si desidera controllare se la funzione è di tipo BuiltinFunctionType
è possibile utilizzare il modulo types
>>> import types
>>> isinstance(pow, types.BuiltinFunctionType)
True
Utilizzando inspect
Or inspect.isbuiltin
(solo un involucro intorno a isinstance(object, types.BuiltinFunctionType)
)
>>> import inspect
>>> inspect.isbuiltin(pow)
True
notare che il termine “built-in” in BuiltinFunctionType
significa “scritto in C”.
consideri il seguente esempio:
>>> from math import factorial
>>> isinstance(factorial, types.BuiltinFunctionType)
True
La funzione factorial
è di tipo BuiltinFunctionType
ma non è una funzione built nell'interprete
>>> factorial in __builtins__.__dict__.values()
False
Ciò è perché il modulo math
in Python costituito da wrapper attorno alle funzioni della libreria matematica C.
Essere in grado di rilevare un BuiltinFunctionType
è utile perché per le funzioni scritte in Python si può ispezionare il codice sorgente senza dover aprire i file di origine.
>>> 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()
Come @ iMom0 detto nella sua risposta - è possibile utilizzare 'isinstance (x, y)' invece di utilizzare 'tipo (x) == tipo (z)', penso che sia più divinatorio :) si – slallum
hai ragione, cosa stavo pensando. –
Questo non ti dice se una funzione è integrata, ti dice se è una funzione C compilata in modo nativo. I moduli di terze parti con estensioni C riporteranno anche le loro funzioni come questo tipo. –