Texto de la función de preprocesamiento en tiempo de ejecución compilación anterior

Decidí intentar preprocesar el texto de la función antes de compilarlo en el código de bytes y luego de la ejecución. Esto es meramente para el entrenamiento. Apenas imagino situaciones en las que sea una solución satisfactoria para ser utilizada. He enfrentado un problema que quería resolver de esta manera, pero finalmente se encontró una mejor manera. Así que esto es solo para entrenamiento y para aprender algo nuevo, no para uso real.

Supongamos que tenemos una función, cuyo código fuente queremos modificar un poco antes de la compilación:

def f():
    1;a()
    print('Some statements 1')
    1;a()
    print('Some statements 2')

Vamos, por ejemplo, a marcar algunas líneas con1;, para que sean comentados a veces y otras veces no. Solo lo tomo por ejemplo, las modificaciones de la función pueden ser diferentes.

Para comentar estas líneas hice un decorador. Todo el código a continuación:

from __future__ import print_function


def a():
    print('a()')


def comment_1(s):
    lines = s.split('\n')
    return '\n'.join(line.replace(';','#;',1) if line.strip().startswith('1;') else line for line in lines)


def remove_1(f):    
    import inspect
    source = inspect.getsource(f)    
    new_source = comment_1(source)
    with open('temp.py','w') as file:
        file.write(new_source)
    from temp import f as f_new
    return f_new


def f():
    1;a()
    print('Some statements 1')
    1;a()
    print('Some statements 2')


f = remove_1(f) #If decorator @remove is used above f(), inspect.getsource includes @remove inside the code.

f()

solíainspeccionar. para recuperar la funciónf código. Luego hice un procesamiento de texto (en este caso, comentando líneas que comienzan con1;). Después de eso lo guardé entemp.py módulo, que luego se importa. Y luego una función.f Está decorado en el módulo principal.

La salida, cuando se aplica el decorador, es esta:

Some statements 1
Some statements 2

cuando NO se aplica es esto:

a()
Some statements 1
a()
Some statements 2

Lo que no me gusta es que tengo que usar el disco duro para cargar la función compilada. Se puede hacer sin escribirlo en el módulo temporal.temp.py e importando de ella?

La segunda pregunta es sobre colocar el decorador arriba.f: @replace. Cuando hago esto,inspect.getsourcelines devolucionesf Texto con este decorador. Podría ser eliminado manualmente defel texto de pero eso sería bastante peligroso, ya que puede haber más de un decorador aplicado. Así que recurrí a la sintaxis de decoración de estilo antiguo.f = remove_1(f), que hace el trabajo. Pero aún así, ¿es posible permitir la técnica de decoración normal con@replace?

Respuestas a la pregunta(2)

Su respuesta a la pregunta