Python Language
Acceso al código fuente y código de bytes de Python
Buscar..
Mostrar el bytecode de una función
El intérprete de Python compila el código a bytecode antes de ejecutarlo en la máquina virtual de Python (consulte también ¿Qué es el bytecode de python?) .
Aquí es cómo ver el código de bytes de una función de Python
import dis
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
# Display the disassembled bytecode of the function.
dis.dis(fib)
La función dis.dis
en el módulo dis devolverá un bytecode descompilado de la función que se le pasó.
Explorando el código objeto de una función.
CPython permite el acceso al objeto de código para un objeto de función.
El objeto __code__
contiene el bytecode en bruto ( co_code
) de la función, así como otra información como constantes y nombres de variables.
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
def fib(n):
if n <= 2: return 1
return fib(n-1) + fib(n-2)
dir(fib.__code__)
Mostrar el código fuente de un objeto.
Objetos que no están incorporados
Para imprimir el código fuente de un objeto Python use inspect
. Tenga en cuenta que esto no funcionará para los objetos incorporados ni para los objetos definidos de forma interactiva. Para estos necesitarás otros métodos explicados más adelante.
Aquí le mostramos cómo imprimir el código fuente del método randint
desde el módulo random
:
import random
import inspect
print(inspect.getsource(random.randint))
# Output:
# def randint(self, a, b):
# """Return random integer in range [a, b], including both end points.
# """
#
# return self.randrange(a, b+1)
Para simplemente imprimir la cadena de documentación
print(inspect.getdoc(random.randint))
# Output:
# Return random integer in range [a, b], including both end points.
Imprima la ruta completa del archivo donde se define el método random.randint
:
print(inspect.getfile(random.randint))
# c:\Python35\lib\random.py
print(random.randint.__code__.co_filename) # equivalent to the above
# c:\Python35\lib\random.py
Objetos definidos interactivamente.
Si un objeto está definido de forma interactiva, inspect
no puede proporcionar el código fuente, pero puede usar dill.source.getsource
en dill.source.getsource
lugar
# define a new function in the interactive shell
def add(a, b):
return a + b
print(add.__code__.co_filename) # Output: <stdin>
import dill
print dill.source.getsource(add)
# def add(a, b):
return a + b
Objetos incorporados
El código fuente de las funciones incorporadas de Python está escrito en c y solo se puede acceder a él consultando el código fuente de Python (alojado en Mercurial o descargable desde https://www.python.org/downloads/source/) .
print(inspect.getsource(sorted)) # raises a TypeError
type(sorted) # <class 'builtin_function_or_method'>