Teclado

A diferença das funções input() e raw_input() no Python

(Last Updated On: 13 de Abril de 2018)

Tenho um sistema escrito em Python, para o terminal, que precisa das credenciais de login do usuário para funcionar:


usuario = input(‘Insira seu login: ‘)
print(‘Olá, ‘ + usuario)

Quando rodo no meu computador, digito meu login e recebo em resposta:


Insira seu login: yanorestes
Olá, yanorestes

Exatamente o que eu tinha digitado, capturado pela variável usuario!

Fui levar o programa para a empresa, mas quando fui testar, digitei meu login e olha o que apareceu:


Insira seu login: yanorestes
Traceback (most recent call last):
  File "login.py", line 1, in <module
    nome = input("Insira seu login: ")
  File "<string>", line 1, in <module>
NameError: name 'yanorestes' is not defined

Ué, “mas funciona no meu computador“! O que significa esse NameError que tivemos como resposta ao rodar o código no computador da empresa?

Esta exceção indica que estamos tentando usar uma variável que não foi definida, nesse caso, yanorestes. Mas yanorestes é o login em uma string, não uma variável, então por que isso acontece?

Vamos checar as versões do Python em cada computador para ver se tem a ver com isso. Primeiro, no meu computador:


yan@yan:~> python -V
Python 3.6.4

Agora, no computador da empresa:


empresa@empres:~> python -V
Python 2.7.14

Ah! Então realmente há uma diferença nas duas versões, como suspeitávamos.

A função input() no Python 2

Por que recebemos o NameError, então? A questão é que a função input(), no Python 2, não transforma a entrada do usuário em string, mas tenta avaliar, calcular ela:


conta = input(‘Digite algo a ser executado: ‘)
print(conta)

Por exemplo, se mandarmos 3 + 5:


Digite algo a ser executado: 3 + 5
8

Então quando tentamos mandar o usuário yanorestes para o input(), ele trata como se fosse uma variável. Como essa variável não existe, recebemos o NameError.

Por conta do pouco uso desse comportamento, ele foi removido no Python 3. Ainda assim, podemos simulá-lo através da função eval(), dessa forma:


conta = eval(input(‘Digite algo a ser executado: ‘))
print(conta)

E então, como no exemplo anterior:


Digite algo a ser executado: 3 + 5
8

Mas, então, como podemos fazer no Python 2 o que a função input() faz no Python 3?

A função raw_input() no Python 2

No Python 2, em vez da função input(), utilizamos a função raw_input() para pegar a entrada do usuário como string, veja:


usuario = raw_input(‘Insira seu login: ‘)
print(‘Olá, ‘ + usuario)

Agora sim:


Insira seu login: yanorestes
Olá, yanorestes

No Python 3, a função raw_input() foi simplesmente renomeada para input().

O que fazer a respeito da diferença de versões?

Como você deve ter percebido, há uma inconsistência aqui – se quisermos capturar uma entrada do usuário como string, não há um código único que simplesmente satisfaça ambas as versões 2 e 3 do Python.

Nesse momento, nós, como programadores, devemos tomar uma decisão pensando nos benefícios de cada versão do Python e, principalmente, na maioria de nossos usuários.

“Mas e se eu precisar que o meu programa funcione em qualquer das duas versões?”

Se quisermos dar uma volta nessa incompatibilidade, é possível checar a versão do Python através do atributo version_info.major do módulo sys, o que nos dá a possibilidade de criar uma condição if e ficar em cima do muro, como no exemplo:


import sys

if sys.version_info.major == 2:
    usuario = raw_input(‘Insira seu login: ‘)
elif sys.version_info.major == 3:
    usuario = input(‘Insira seu login: ‘)

O perigo de executar uma entrada do usuário

É importantíssimo notar o quão perigosas são as funções input() no Python 2 e eval() em ambas as versões!

Executar algo digitado pelo usuário abre uma tremenda brecha na segurança do programa e até do computador em que o programa está sendo utilizado.

Veja nesse artigo de Ned Batchelder um pouco mais dos perigos do eval(). Um simples exemplo:


eval("os.system(‘ls /’)")

Isso listaria os arquivos no diretório raiz de nosso computador.

E se, em vez de listar, usássemos o comando de deletar? Todos os arquivos e diretórios de nosso computador seriam apagados, sem mais nem menos!

Por isso, sempre devemos lembrar de tomar cuidado ao executar uma entrada do usuário.

Conclusão

Nesse post, aprendemos as diferenças entre as funções raw_input() e input(), como isso muda do Python 2 para o Python 3 e até um pouco sobre eval() e seus perigos!

E aí? Resolveu essa dúvida cruel? Se está interessado em Python e quer aprender mais, que tal dar uma olhada nos nossos cursos na Alura sobre a linguagem?

FIQUE POR DENTRO

Produtor de conteúdo na Alura e desenvolvedor apaixonado. Explicit is better than implicit

Próximo ArtigoRealizando cadastros de imagens com a Amazon AWS e Spring MVC