Pular para o conteúdo

Como Utilizar a Função eval do Python?

[

Python eval(): Avaliando Expressões de Forma Dinâmica

Entendendo o eval() do Python

Você pode usar a função interna eval() do Python para avaliar expressões Python arbitrariamente a partir de uma entrada baseada em string ou compilada em código. Essa função pode ser muito útil quando você está tentando avaliar dinamicamente expressões Python a partir de qualquer entrada que seja uma string ou um objeto de código compilado.

Embora o eval() do Python seja uma ferramenta incrivelmente útil, a função possui algumas importantes implicações de segurança que você deve considerar antes de utilizá-la. Neste tutorial, você aprenderá como o eval() funciona e como usá-lo de forma segura e eficaz em seus programas Python.

Neste tutorial, você aprenderá:

  • Como o eval() do Python funciona
  • Como usar o eval() para avaliar dinamicamente entradas de string ou de código compilado
  • Como o eval() pode tornar o seu código inseguro e como minimizar os riscos de segurança associados

Além disso, você aprenderá a usar o eval() do Python para criar um aplicativo que avalia expressões matemáticas de forma interativa. Com esse exemplo, você aplicará tudo o que aprendeu sobre o eval() a um problema do mundo real. Se você quiser obter o código para este aplicativo, clique no link abaixo:

Entendendo o eval() do Python

Você pode usar o eval() do Python para avaliar dinamicamente expressões a partir de uma entrada baseada em string ou compilada em código. Se você passar uma string para o eval(), a função irá analisá-la, compilá-la em bytecode e avaliá-la como uma expressão Python. Porém, se você chamar o eval() com um objeto de código compilado, a função realizará apenas a etapa de avaliação, o que é bastante conveniente se você chamar o eval() várias vezes com a mesma entrada.

A assinatura do eval() do Python é definida da seguinte forma:

eval(expressao[, globais[, locais]])

A função possui um primeiro argumento chamado expressão, que contém a expressão que você precisa avaliar. O eval() também aceita dois argumentos opcionais:

  1. globais
  2. locais

Nas próximas três seções, você aprenderá o que são esses argumentos e como o eval() os utiliza para avaliar expressões Python dinamicamente.

Observação: Você também pode usar o exec() do Python para executar códigos dinamicamente. Essa função é semelhante ao eval(), mas em vez de avaliar uma única expressão, ela executa um bloco de código contendo várias instruções. No entanto, como o exec() pode representar um risco de segurança maior, é recomendável utilizar o eval() sempre que for necessário avaliar apenas uma expressão.

Avaliando Expressões com o eval() do Python

Agora que você entende como o eval() funciona, vamos explorar como usá-lo para avaliar diferentes tipos de expressões em Python.

Expressões Booleanas

O eval() pode ser usado para avaliar expressões booleanas. Você pode passar uma string contendo uma expressão booleana para o eval() e ele retornará o resultado da avaliação dessa expressão. Veja um exemplo:

result = eval("10 > 5")
print(result) # Output: True

Nesse exemplo, a expressão “10 > 5” é avaliada como True pelo eval(). O resultado é armazenado na variável result, que é então impressa na tela.

Expressões Matemáticas

O eval() também é útil para avaliar expressões matemáticas. Você pode passar uma string contendo uma expressão matemática para o eval() e ele retornará o resultado da avaliação dessa expressão. Veja um exemplo:

result = eval("2 + 2")
print(result) # Output: 4

Nesse exemplo, a expressão “2 + 2” é avaliada como 4 pelo eval(). O resultado é armazenado na variável result e impresso na tela.

Expressões de Uso Geral

Além de expressões booleanas e matemáticas, o eval() também pode ser usado para avaliar expressões de uso geral em Python. Isso inclui chamadas de função, manipulação de listas e dicionários, entre outras operações. Veja um exemplo:

result = eval("len([1, 2, 3])")
print(result) # Output: 3

Nesse exemplo, a expressão “len([1, 2, 3])” é avaliada pelo eval() como uma chamada de função que retorna o comprimento da lista [1, 2, 3]. O resultado é armazenado na variável result e impresso na tela.

Minimizando os Problemas de Segurança do eval()

Embora o eval() seja uma função poderosa, também pode representar um risco de segurança se não for usado adequadamente. Por isso, é importante tomar precauções ao utilizar o eval() em seu código Python. Nesta seção, você aprenderá algumas formas de minimizar os problemas de segurança associados ao eval().

Restringindo globais e locais

Uma das formas de minimizar os problemas de segurança do eval() é restringir o acesso às variáveis globais e locais do seu programa. Isso pode ser feito passando dicionários vazios como argumentos opcionais para o eval(). Por exemplo:

result = eval("x + y", {}, {})

Nesse exemplo, o eval() não terá acesso a nenhuma variável global ou local, o que ajuda a evitar que código malicioso acesse informações sensíveis do seu programa.

Restringindo o Uso de Nomes Pré-definidos

Outra forma de minimizar os problemas de segurança é restringir o uso de nomes pré-definidos. Você pode passar um dicionário contendo apenas os nomes que você deseja permitir o acesso ao eval(). Por exemplo:

allowed_names = {"x": 10, "y": 5}
result = eval("x + y", allowed_names)

Nesse exemplo, o eval() só terá acesso às variáveis “x” e “y”, cujos valores são definidos no dicionário allowed_names. Isso impede que código malicioso acesse outras variáveis do seu programa.

Restringindo os Nomes de Entrada

Você também pode restringir os nomes que podem ser utilizados como entrada para o eval(). Por exemplo, você pode verificar se a entrada contém apenas letras e números antes de avaliá-la. Se a entrada contiver caracteres especiais ou palavras-chave perigosas, você pode rejeitá-la. Veja um exemplo:

input_expression = "x + y"
if all(c.isalnum() for c in input_expression):
result = eval(input_expression)
else:
print("Invalid input!")

Nesse exemplo, antes de avaliar a expressão “x + y”, o código verifica se a expressão contém apenas letras e números. Se for o caso, o eval() é chamado e o resultado é armazenado na variável result. Caso contrário, a mensagem “Invalid input!” é impressa na tela.

Restringindo a Entrada Apenas a Literais

Uma forma mais segura de utilizar o eval() é restringir a entrada a apenas literais. Isso significa que você só avaliará valores que podem ser representados diretamente no código Python, como números inteiros, strings, listas e dicionários literais. Essa abordagem minimiza ainda mais os riscos de segurança. Veja um exemplo:

literal_expression = "[1, 2, 3]"
result = eval(literal_expression)

Nesse exemplo, a expressão “[1, 2, 3]” é passada diretamente ao eval() como um literal de lista. Como a expressão é um valor literal e não contém código executável, não há riscos de segurança envolvidos.

Usando o eval() do Python com a função input()

Uma aplicação interessante do eval() é usá-lo juntamente com a função input() para criar um programa interativo que avalia expressões inseridas pelos usuários. Veja um exemplo:

expression = input("Digite uma expressão Python: ")
result = eval(expression)
print("O resultado é:", result)

Nesse exemplo, o programa solicita ao usuário que digite uma expressão Python. Essa expressão é então avaliada utilizando o eval() e o resultado é impresso na tela. Com essa abordagem, você pode criar programas que permitem aos usuários executarem cálculos ou realizarem operações com base nas expressões que eles inserem.

Construindo um Avaliador de Expressões Matemáticas

Agora que você entende como o eval() funciona e como usá-lo de forma segura, vamos construir um exemplo prático de um avaliador de expressões matemáticas. Esse programa irá interagir com o usuário, permitindo que ele insira expressões matemáticas e retornando o resultado dessas expressões. Veja o código abaixo:

while True:
expression = input("Digite uma expressão matemática (ou 'sair' para encerrar): ")
if expression == "sair":
break
try:
result = eval(expression)
print("O resultado é:", result)
except:
print("Expressão inválida!")

Neste exemplo, o programa inicia um loop infinito e solicita ao usuário uma expressão matemática. Se o usuário digitar “sair”, o programa é encerrado. Caso contrário, o programa tenta avaliar a expressão utilizando o eval() e imprime o resultado. Se a expressão for inválida, uma mensagem de erro é exibida.

Conclusão

O eval() do Python é uma poderosa ferramenta que permite avaliar expressões Python dinamicamente. No entanto, é importante estar ciente das implicações de segurança do eval() e tomar precauções ao utilizá-lo em seu código. Ao restringir globais e locais, o uso de nomes pré-definidos, os nomes de entrada e limitando a entrada a apenas literais, você pode minimizar os riscos de segurança associados ao eval().

Além disso, vimos como usar o eval() juntamente com a função input() para criar programas interativos que permitem aos usuários inserirem e avaliarem expressões Python. Por fim, construímos um exemplo prático de um avaliador de expressões matemáticas. Agora você tem todas as ferramentas necessárias para usar o eval() de forma segura e eficaz em seus programas Python.