Ir para o conteúdo

Função eval

Função eval em cadeias de caracteres

A função eval() transforma uma cadeia de caracteres em código utilizável:

>>> s = '1+2'
>>> r = eval(s)
>>> r
3
>>> type(r)
<type 'int'>

>>> r = eval('[1, 6, 7.5] + [1, 2]')
>>> r
[1, 6, 7.5, 1, 2]
>>> type(r)
<type 'list'>

Seja cuidadoso com o eval

Cuidado com o eval e os valores da cadeia de caracteres.

Queremos r = 'programa de valores'. Se escrevermos:

r = eval('programa de valores')

É a mesma coisa que:

r = programa de valores

Que é uma expressão inválida e uma sintaze ilegal!

A solução é colocar aspas dentro de aspas:

s = "'programa de valores'"
r = eval(s)                ## r se torna 'programa de valores'

Com eval um pequeno programa pode muito

Programa:

i1 = eval(raw_input('Valor 1: '))
i2 = eval(raw_input('Valor 2: '))
r = i1 + i2
print '%s + %s se torna %s\n com valor %s' % \
      (type(i1), type(i2), type(r), r)

Podemos adicionar inteiros e pontos flutuantes:

Valor 1: 1
Valor 2: 3.0
<type 'int'> + <type 'float'> se torna <type 'float'>
com valor 4

Ou duas listas:

Valor 1: [1,2]
Valor 2: [-1,0,1]
<type 'list'> + <type 'list'> se torna <type 'list'>
com valor [1, 2, -1, 0, 1]

Grande flexibilidade do eval grande problema

Sua grande flexibilidade também quebra rapidamente programas:

Valor 1: (1,2)
Valor 2: [3,4]
Traceback (most recent call last):
    r = i1 + i2
TypeError: can only concatenate tuple (not "list") to tuple

Valor 1: um
Traceback (most recent call last):
    i1 = eval(raw_input('operand 1: '))
  File "<string>", line 1, in <module>
NameError: name 'um' is not defined

Valor 1: 4
Valor 2: 'Oi, senhor eval!'
Traceback (most recent call last):
    r = i1 + i2
TypeError: unsupported operand type(s) for +: 'int' and 'str'