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'>


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow