15 de junho de 2009

O input do python 3

No Python 2.x nós temos 2 modos de entrada de dados o input() e raw_input()
Primeiro vamos entender como cada um funciona pra depois sabermos como ficou agora e porque a mudança no Python 3

raw_input()
o raw_input() captura pela entrada padrão (sys.stdin.readline) tudo o que você digita (até apertar "enter") e lhe retorna como uma string, mais simples que isso impossivel, opcionalmente você pode também colocar uma mensagem quando chama o raw_input()
ex:
>>> raw_input()
1, 2, 3 # <-- usuario digita
'1, 2, 3'
raw_input retornou a string "1, 2, 3"
Se quisermos avisar o que tipo de dado estamos esperando podemos fazer:
>>> raw_input("Digite seu nome: ")
Digite seu nome: Larry # <-- usuario digita
'Larry'
Simples sem misterios.

input()
o input por outro lado é muito mais "esperto", tão esperto que a maioria embora acha que saiba, na verdade não tem noção de como ele funciona (eu já estive nesta lista)
muitos o input() é muito parecido com o raw_input() com a diferenca dele "avaliar" os tipo de dados e retornar os tipo "certo"
ex:
>>> x = input()
1
>>> type(x)
#input avalia a entrada como um inteiro
>>> input()
1, 2, 3
(1, 2, 3) # input retornava uma tupla de 3 inteiros

>>> input()
1, haha, 4.8
(1, 'haha', 4.8) #input retornava uma tupla com um inteiro uma string e um float
Então você pensa: "esse é o kra que eu vou usar sempre"
Mas o buraco é mais embaixo do que você pensa
ex:
>>> input("usuario digita: ")
usuario digita: if x
Traceback (most recent call last):
File "", line 1, in ;
File "", line 1
if x
^
SyntaxError: invalid syntax
WTF???
Sim amigo ele faz mais do que você pensa.
O "esperado" seria uma string "if x"
Na verdade o input() pega o que você digita, roda e da um retorno como uma expressão python, na verdade você disponibiliza um "terminal" python e pega o retorno
ex:
>>> x = 2
>>> input("usuario digita: ")
usuario digita: x + 3
5 #retorno de input() sera o valor da variavel x mais o int 3

>>> input("usuario digita: ")
usuario digita: x == 4 and "ola" or "NAUM e PAH"
"NAUM e PAH"
Se não for bem tratado isso pode ser MUITO perigoso.

Enquanto isso no Python 3...

No python 3.0 isso foi mudado, o raw_input() foi renomeado para input() se tornando o input padrão
- E o input() antigo?
Foi sumariamente REMOVIDO, exterminado, jogaram ele no marmore do inferno
Mas nem tudo está perdido, se você prestou atenção deve ter percebido que existe alguém que praticamente a mesma coisa que o antigo input com um pequena diferença. Eu estou falando do eval():
O eval() recebe um string faz e o mesmo que o antigo input() (na verdade seria o contrario, o input() faz o mesmo que o eval()), ele
avalia a string no interpretador python e retorna o resultado da expressão, da mesma forma que o console python faz.
Entao para se ter o mesmo efeito do antigo input basta chamar a funcao eval() pro retorno de input
>>> input()
1, 2, 3 # <-- usario digita
'1, 2, 3" # <-- string

>>> eval('1, 2, 3")
(1, 2, 3)

#portanto
>>> eval(input())
1, 2, 3 # <-- usario digita
(1, 2, 3) # <-- tupla
Quando você for converter seus programas python 2.x para 3 bastar usar eval(input()) e você terá o mesmo efeito (mas agora você sabe o motivo ;-) )

mais posts sobre Python:
1 - Vantagens do novo print do Python 3
2 - Diferencas entre o Python 3 vs Python 2.x
3 - Edje / QEdje (usando Python)4 - Receitas com Python
5 - Mini Curso PyGame - JED 2008

7 comentários:

Unknown disse...

muito bem explicado.
gostei.

Caio Xavier disse...

Estudo na UFRPE e seus posts sobre as diferenças nas versões do python ajudaram bastante para a organização de um seminário aqui na faculdade.
obrigado e parabéns ;)

Portygas disse...
Este comentário foi removido pelo autor.
Portygas disse...

Muito bom, me ajudou bastante. Estou fazendo um curso online mas o material usa o Python 2.

Unknown disse...
Este comentário foi removido pelo autor.
Unknown disse...

Karaka que lindo! Parabéns excelente post.

Julia (@itsjuhere) disse...

Muito bom!!! Amei