2009-04-22 8 views
9

duplicados de ..Python reflexión - ¿Puedo usar esto para obtener el código fuente de una definición del método


I tener una definición de método que es éxito completamente en ejecución, pero me gustaría modificarlo en tiempo de ejecución.

por ejemplo: Si tengo un método

def sayHello(): 
    print "Hello" 

tipo (sayHello) me da la 'función de tipo' respuesta. ¿Podré obtener la cadena del código fuente de este objeto de función? ¿Se considera un problema de seguridad?

+3

No se puede hacer esto. Duplicado: http://stackoverflow.com/questions/427453/how-can-i-get-the-code-of-python-function; http://stackoverflow.com/questions/334851/print-the-code-which-defined-a-lambda-function; http://stackoverflow.com/questions/399991/python-how-do-you-get-python-to-write-down-the-code-of-a-function-it-has-in-memo –

+0

Es Python : ya tienes la fuente. –

+3

Recomiendo encarecidamente hacer otra pregunta con más detalles. Tengo la sensación más divertida de que lo que realmente quieres hacer puede que solo requiera cierres/decoradores, pero como todo lo que has preguntado es imprimir el código fuente (y tratar de modificarlo de alguna manera) estás obteniendo respuestas decepcionantes. –

Respuesta

2

sayHello.func_code.co_code devuelve una cadena que creo que contiene el código compilado del método. Dado que Python está compilando internamente el código en bytecode de máquina virtual, esto podría ser todo lo que queda.

Puede desmontarlo, sin embargo:

import dis 

def sayHello(): 
    print "hello" 

dis.dis(sayHello) 

Esta impresora:

 
    1   0 LOAD_CONST    1 ('hello') 
       3 PRINT_ITEM 
       4 PRINT_NEWLINE 
       5 LOAD_CONST    0 (None) 
       8 RETURN_VALUE 

Tenga una mirada en Decompyle para un de-compilador.

0

No hay una función incorporada para obtener el código fuente de una función, sin embargo, podría compilarla usted mismo si tiene acceso al código fuente (estaría en su directorio Python/lib).

17

utilizar el módulo de inspección:

import inspect 
import mymodule 
print inspect.getsource(mymodule.sayHello) 

La función debe ser definida en un módulo que se importa.

Cuestiones relacionadas