2012-09-10 20 views

Respuesta

9

El módulo tipos:

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

Sin embargo, si se mira bajo el capó, encontrará que no es tan diferente de lo que está haciendo ahora.

Así, en su caso, utilizar

isinstance(o, types.BuiltinFunctionType) 
+0

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

+0

se Tienes razón, en qué estaba pensando. –

+1

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

3

Prueba esto:

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

también se puede hacer

import __builtin__ 
o in __builtin__.__dict__.values() 

o, en CPython:

o in __builtins__.__dict__.values() 

, pero tenga en cuenta que confía en un detalle de implementación aquí.


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

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() 
Cuestiones relacionadas