Ir para o conteúdo

Função exec

Uma função similar exec

  • eval(s) avalia uma expressão s;
  • eval('r = 1 + 1') é ilegal porque é uma declaração, não uma expressão;
  • ...mas podemos usa o exec para transformar uma ou mais declarações completas para dentro do código.
declaracao = 'r = 1+1'   #armazena a declaração em uma cadeia de caracteres
exec(declaracao)
print r                 #imprime 2

Para códigos longos podemos utilizar as cadeias de caracteres multilinha:

import math

umcodigo = '''
def f(t):
    term1 = math.exp(-a*t)*math.sin(w1*x)
    term2 = 2*math.sin(w2*x)
    return term1 + term2
'''
exec(umcodigo)  #executa a cadeia de caracteres como um código Python

exec para função em tempo de execução

O exec pode ser utilizado para contruir uma função em tempo de execução.

Embutindo uma formula de usuário em uma função Python:

import math

formula = raw_input('Escreva uma fórmula envolvendo x: ')
codigo = """
def f(x):
    return %s
""" % formula

exec(codigo)          #converte a cadeia de caracteres em código

#pergunte ao usuário valores de x e avalie f(x)
x = 0
while x is not None:
    x = eval(raw_input('Valor de x (Digite None para sair): '))
    if x is not None:
        y = f(x)
        print 'f(%g)=%g' % (x, y)

Enquanto o programa está rodando o usuário digita a equação, que se transforma em uma função Python, então o usuário fornece um valor para x até que a resposta seja None, e o programa avalia a função f(x).

O programador não tem idéia da escolha do usuário para a função f(x) quando ele escreve o programa!