24 janeiro 2013

Python 2.x versus 3.x

Procurando mais informações sobre o python e como uso o 3.3 acaba que mais cedo ou mais tarde me deparo com alterações implementadas nessas últimas versões. A primeira que vou explorar e trazer aqui será sobre o comando input().

Para quem já usa o python 3.3 já deve ter notado que o raw_input já era. E o motivo disso é muito simples:

Primeiro explicando o raw_input(): este como a maioria já sabe serve para receber dados e transforma tais dados em strings. Sejam números ou qualquer informação que seja. Já o input('') tem uma capacidade superior que é identificar o valor que está sendo colocado, mas também ele tem a capacidade de aceitar códigos, como o terminal. Basicamente, no python 2.7 se você usar input(''), você estará abrindo uma porta para alguém intervir no código. Isso pode ser bom em termos se necessário.



Já no Python 3.x a coisa ficou diferente, parcialmente. A princípio o raw_input() mudou para input('') somente, mas agora os parênteses são obrigatórios. Este é um raw_input inteligente, fazendo o que o raw não fazia que é identificar o tipo de entrada e portanto gerar tipos distintos ao invés de criar somente strings. Até ai tudo bem. Agora o antigo input(), que dava acesso à intervenções no código se tornou eval(). Basicamente com a mesma função, mas tecnicamente mais restrito, já que o input() já serve pra maioria das coisas com mais eficiência. No entanto descobri por meio deste eval que dá pra criar entradas múltiplas para variáveis diferentes.



O problema consiste somente no fato de que por meio do eval se pode intervir no código com códigos. Basicamente o processo de entrada eval vai tentar usar os dados, se estes significarem algo pra linguagem de modo a fazer com que este código seja usado como se já fosse uma implementação. Podendo criar quebras e travamentos.

De qualquer modo acredito ser muito simples impedir tal ocorrência por meio do .replace. Ainda não testei devidamente, mas parece ser uma saída. Logo quando testar atualizo o post.

Uma das fontes que utilizei para fazer esse post fala que não há modo seguro com eval(), o que é uma pena. Link

Nenhum comentário:

Postar um comentário