Texto da função de pré-processamento em compilação bofore em tempo de execução

Decidi tentar pré-processar o texto da função antes de ser compilado em código de bytes e após a execução. Isso é meramente para treinamento. Eu dificilmente imagino situações em que esta seja uma solução satisfatória para ser usada. Eu enfrentei um problema que eu queria resolver dessa maneira, mas eventualmente uma maneira melhor foi encontrada. Então, isso é apenas para treinamento e para aprender algo novo, não para uso real.

Suponha que tenhamos uma função, qual código-fonte queremos que seja modificado um pouco antes da compilação:

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

Vamos, por exemplo, marcar algumas linhas dele com1;, para eles serem às vezes comentados e às vezes não. Eu apenas tomo por exemplo, modificações da função podem ser diferentes.

Para comentar essas linhas eu fiz um decorador. O código inteiro abaixo:

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

eu useiinspecionar. recuperar a funçãof código. Então eu fiz um processamento de texto (neste caso, comentando linhas começando com1;). Depois disso eu salvei paratemp.py módulo, que é então importado. E então uma funçãof está decorado no módulo principal.

A saída, quando o decorador é aplicado, é isto:

Some statements 1
Some statements 2

quando não aplicado é este:

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

O que eu não gosto é que eu tenho que usar o disco rígido para carregar a função compilada. Pode ser feito sem escrevê-lo para o módulo temporáriotemp.py e importando dele?

A segunda questão é sobre a colocação do decorador acimaf: @replace. Quando faço issoinspect.getsourcelines devolvef texto com este decorador. Eu poderia ser excluído manualmente deftexto. mas isso seria bastante perigoso, pois pode haver mais de um decorador aplicado. Então eu recorri à sintaxe de decoração de estilo antigof = remove_1(f), que faz o trabalho. Mas ainda assim, é possível permitir técnica de decoração normal com@replace?

questionAnswers(2)

yourAnswerToTheQuestion