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'