2012-09-10 17 views

risposta

9

Il modulo tipi:

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

Anche se, se si guarda sotto il cofano, troverete che non è così diverso da quello che stai facendo ora.

Quindi, nel tuo caso, utilizzare

isinstance(o, types.BuiltinFunctionType) 
+0

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

+0

hai ragione, cosa stavo pensando. –

+1

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. –

3

Prova questo:

>>> import types 
>>> isinstance(pow, types.BuiltinFunctionType) 
True 
>>> def a(): 
    pass 
>>> isinstance(a, types.BuiltinFunctionType) 
False 
2

si può anche fare

import __builtin__ 
o in __builtin__.__dict__.values() 

o, in CPython:

o in __builtins__.__dict__.values() 

ma si noti che si basa su un dettaglio di implementazione qui.


>>> pow in __builtins__.__dict__.values() 
True 
>>> def a(): 
... pass 
... 
>>> a in __builtins__.__dict__.values() 
False 
>>> 
0

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() 
Problemi correlati