English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Python 基础教程

Python 流程控制

Funções do Python

Tipos de Dados do Python

Python 文件操作

Python 对象和类

Python 日期和时间

Python 高级知识

Python 参考手册

Python eval() 使用方法及示例

Funções integradas do Python

eval()方法解析传递给该方法的表达式,并在程序中运行python表达式(代码)。

简而言之,eval()方法在程序内运行python代码(作为参数传递)。

eval()的语法为:

eval(expression, globals=None, locals=None)

eval()参数

eval()有三个参数:

  • expression-解析并评估为Python表达式的字符串

  • globals(可选)-字典

  • locals(可选)-映射对象。字典是Python中常用的标准映射类型。

稍后将在本文中讨论全局变量(globals)e本地变量(locals)的使用。

eval()返回值

eval()方法返回从expression求值的结果。

Exemplo1:如何在工作中的eval()?

x = 1
print(eval('x')) + 1))

Quando este programa for executado, a saída será:

2

Aqui, eval() calcula a expressão x + 1e imprima.

Exemplo2: exemplo real de uso de eval()

# Comprimento do quadrado
def calculatePerimeter(l):
  return 4*l
# Área quadrada
def calculateArea(l):
  return l*1
property = input("Insira a função a ser usada: ")
for l in range(1, 5)
    if (property == 'calculatePerimeter(l)'):
        print("Se o comprimento for ", l, ", comprimento = ", eval(property))
    elif (property == 'calculateArea(l)'):
        print("Se o comprimento for ", l, ", área = ", eval(property))
    else:
      print('Função de erro')
      break

A saída do programa acima será:

Insira a função a ser usada: calculatePerimeter(l)
Se o comprimento for  1 , comprimento =  4
Se o comprimento for  2 , comprimento =  8
Se o comprimento for  3 , comprimento =  12
Se o comprimento for  4 , comprimento =  16

Por que é importante ser cuidadoso ao usar eval()?

Considere um caso em que você está usando um sistema Unix (macOS, Linux, etc.) e já importou o módulo os. O módulo os fornece métodos portáteis para usar funcionalidades do sistema operacional, como: ler ou escrever arquivos.

Se o usuário for permitido a usar eval(input()) para inserir valores, ele pode emitir comandos para alterar o arquivo, e até mesmo usar command para deletar todos os arquivos os.system('rm' -rf *)

Se o eval(input()) for usado no código, é melhor verificar quais variáveis e métodos o usuário pode usar. Você pode usarMétodo dir()Verifique as variáveis e métodos disponíveis.

from math import *
print(eval('dir()'))

Quando você executar o programa, a saída será semelhante a:

__annotations__, __builtins__, __doc__, __file__, __loader__, __name__, __package__, __spec__, acos, acosh, asin, asinh, atan, atan2atanh, ceil, copysign, cos, cosh, degrees, e, erf, erfc, exp, expm1', 'fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot', 'inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'ldexp', 'lgamma', 'log', 'log'10', 'log1p', 'log2', 'modf', 'nan', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'squareRoot', 'tan', 'tanh', 'tau', 'trunc'

restrições no uso de métodos e variáveis disponíveis no eval()

Normalmente, pode não ser necessário usarExpressão(o primeiro parâmetro do eval()) todas as métodos e variáveis disponíveis, até mesmo possíveis vulnerabilidades de segurança. Você pode precisar limitar o uso desses métodos e variáveis no eval(). Você pode fazer isso passando o opcionalglobalselocalsparâmetro (dicionário) para o método eval() para implementar.

1. Quando os parâmetros globals e locals forem omitidos

Se ambos os parâmetros forem omitidos (como no exemplo anterior), o código será executado no escopo atualExpressão. Você pode usar o seguinte código para verificar as variáveis e métodos disponíveis:

print(eval('dir()'))

2. Passar o parâmetro global; omitir o parâmetro locals

globals e localsparâmetro(dicionário), respectivamente para variáveis globais e locais. Se omitirlocalsdicionário, o padrão églobalsisto é, dicionário. Isso significa que,globalsserá usado para variáveis globais e locais.

Atenção:Você pode usar separadamenteglobals()elocals()Métodos internos no Python verificam o dicionário global e o dicionário local atual.

Passar um dicionário vazio como parâmetro global

from math import *
print(eval('dir()', {}))
# O seguinte código gerará uma exceção
# print(eval('sqrt(25)

se passar um dicionário vazio comoglobalsse passar, apenas __builtins__ pode ser usado na expressão (expression) (o primeiro parâmetro do eval()). Mesmo que tenhamos importado o módulo math no programa acima,expressão (expression)também não pode ser acessadomódulo mathqualquer funcionalidade fornecida.

Quando este programa for executado, a saída será:

__builtins__

Torna alguns métodos disponíveis

from math import *
print(eval('dir()', {'sqrt': sqrt, 'pow': pow}))

Aqui, a expressão também pode usar métodos sqrt() e pow() e __builtins__.

Além disso, você pode alterar conforme desejar as funções e variáveis disponíveis.Expressão(expressão) métodos. O nome do método.

from math import *
print(eval('dir()', {'squareRoot': sqrt, 'pow': pow}))
# Uso de raiz quadrada na expressão
print(eval('squareRoot(9)', {'squareRoot': sqrt, 'pow': pow}))

No programa acima, squareRoot() calcula a raiz quadrada (funções semelhantes, como sqrt()). No entanto, tentar usar sqrt() provocará um erro.

Limitar o uso de __builtins__

Você pode limitar __builtins__ da seguinte forma:Na expressão (expression),do uso:

eval(expression, {'__builtins__': None})

3. Através de dicionários global e local

Você pode passarLocallocals)dicionário para tornar as funções e variáveis necessárias disponíveis. Por exemplo:

from math import *
a = 5
print(eval('sqrt(a)', {'__builtins__': None}, {'a': a, 'sqrt': sqrt}))

Quando este programa for executado, a saída será:

 2.23606797749979

Neste programa,Expressão(expressão)(o primeiro parâmetro do eval)pode ter apenas métodos sqrt() e variáveisa。Todos os outros métodos e variáveis não estão disponíveis.

através da passagemglobalselocalsRestringir o uso de eval() com dicionários pode tornar seu código mais seguro, especialmente quando se usa entrada fornecida pelo usuário no método eval().

Funções integradas do Python