English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
eval()方法解析传递给该方法的表达式,并在程序中运行python表达式(代码)。
简而言之,eval()方法在程序内运行python代码(作为参数传递)。
eval()的语法为:
eval(expression, globals=None, locals=None)
eval()有三个参数:
expression-解析并评估为Python表达式的字符串
globals(可选)-字典
locals(可选)-映射对象。字典是Python中常用的标准映射类型。
稍后将在本文中讨论全局变量(globals)e本地变量(locals)的使用。
eval()方法返回从expression求值的结果。
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.
# 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
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'
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.
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()'))
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.
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__
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.
Você pode limitar __builtins__ da seguinte forma:Na expressão (expression),do uso:
eval(expression, {'__builtins__': None})
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().