Como usar as funções de avaliação e executão no Python

Como usar as funções de avaliação e executão no Python

Este artigo abordará um guia sobre o uso de funções "Eval" e "Exec" disponíveis na Biblioteca Python padrão. Essas funções podem ser usadas de várias maneiras para avaliar e executar expressões de python. O uso de ambas as funções pode ser melhor compreendido através de exemplos. Alguns exemplos estão listados abaixo. Todas as amostras de código deste artigo são testadas com Python 3.9.5 no Ubuntu 21.04.

Usando avaliar para avaliar expressões python

A função de avaliação pode ser usada para avaliar expressões python e obter um valor de retorno deles. Qualquer expressão de python que precisa ser avaliada é fornecida à função de avaliação na forma de um argumento obrigatório. Expressões passadas como um argumento para as funções de avaliação têm acesso total às funções python integradas, bem como a namespaces globais e locais. Dê uma olhada no exemplo de código abaixo:

n = 1
Result = Eval ("N * 2")
Imprimir (resultado)
Eval ("Print (n * 2)")

Citações triplas no exemplo acima são usadas para apresentar strings "como está", sem escapar de caracteres especiais ou fazer outras modificações. A primeira declaração na amostra de código define uma variável chamada "n" com um valor de 1. Em seguida, o método de avaliação é chamado fornecendo -lhe uma expressão python em formato de string. Na expressão da string, a variável “n” foi referenciada, pois já está disponível no espaço de nome. A próxima declaração imprime a saída da variável "resultado". A última declaração ilustra que você pode chamar diretamente as funções python integradas na expressão fornecida à função de avaliação como um argumento.

Depois de executar a amostra de código acima, você deve obter a seguinte saída:

2
2

Como você pode ver na saída acima, ambas as declarações de impressão produzem o mesmo resultado.

Opcionalmente, você pode fornecer dicionários personalizados para os namespaces globais e locais para restringir e controlar objetos de namespace permitidos. Dê uma olhada no exemplo de código abaixo:

n = 1
Result = Eval ("N * 2")
Imprimir (resultado)
Eval ("Print (M * 2)", 'm': 1)
Eval ("Print (n * 2)", 'm': 1)

Na declaração de avaliação na quarta linha, um argumento extra é fornecido onde um dicionário de objetos de namespace global personalizado é usado. Quando você fornece um dicionário de objetos globais personalizados, apenas métodos internos e mapeamentos incluídos no dicionário são usados ​​por avaliação. Se você usar um dicionário global vazio (""), apenas métodos internos são permitidos e nem mesmo importações personalizadas. Como o objeto "M" no dicionário global tem um valor de 1, a declaração de avaliação é capaz de usar uma referência para "M". Na última declaração, o objeto "M" está disponível no dicionário global, mas não na variável "n", como um dicionário personalizado de objetos globais foi fornecido. A última declaração apresentará um erro, pois não há definição para "n" no dicionário de namespace global personalizado.

Depois de executar a amostra de código acima, você deve obter a seguinte saída:

2
2
Traceback (chamada mais recente):
Arquivo "/home/user/downloads/./teste.py ", linha 7, em
Eval ("Print (n * 2)", 'm': 1)
Arquivo "", linha 1, em
NomeError: nome 'n' não está definido

Você pode usar um dicionário para objetos de namespace local da mesma maneira que objetos globais de namespace. Basta fornecer um dicionário personalizado como um terceiro argumento para a função de avaliação de usá -lo como um mapeamento para objetos de namespace local.

Usando o EXEC para executar o código Python

A função EXEC funciona semelhante à função de avaliação com algumas diferenças. A expressão fornecida à função EXEC pode ser uma string ou qualquer outro objeto Python válido que contenha código python válido. Em comparação, a função avalia apenas expressões de string. Você também pode fornecer dicionários personalizados para objetos de namespace global e local e o método EXEC se comporta da mesma maneira que a função de avaliação quando os mapeamentos de namespace personalizados são usados. Outra diferença com a função de avaliação é que a função EXEC sempre retorna um valor "nenhum". Dê uma olhada no exemplo de código abaixo:

n = 1
resultado = Exec ("N * 2")
Imprimir (resultado)
exec ("print (n * 2)")
resultado = "print (n * 2)"
EXEC (resultado)

O bloco de código é muito semelhante ao exemplo de código usado no exemplo de avaliação, mas em vez da função de avaliação, agora a função EXEC foi usada. Depois de executar a amostra de código acima, você deve obter a seguinte saída:

Nenhum
2
2

Como afirmado anteriormente, a função EXEC sempre retorna um valor "nenhum", portanto a terceira linha produz "nenhum" como a saída. Em seguida, a instrução EXEC na quarta linha faz uso da função "impressão" para produzir "2" como a saída. A variável de resultado recebe um novo valor, fornecendo uma instrução Código Python válida no formulário String. A última declaração mostra que a função EXEC pode chamar diretamente os objetos de código contendo código python válido. Também produz "2" como a saída.

Considerações de segurança

Ao usar as funções Eval e Exec, você deve estar ciente de que essas duas funções permitem a execução de expressões arbitrárias de python e blocos de código. Se você não está consciente sobre o que está sendo usado em expressões, essas declarações podem causar danos ao ambiente em que você está trabalhando. Por exemplo, você pode estar modificando involuntariamente, removendo ou fazendo alterações irreversíveis nos arquivos armazenados no host usando os módulos "OS" e "SYS" e seus métodos nas funções Eval e Exec. O módulo "subprocesso" no Python permite lançar novos processos e executar comandos de shell. Expressões nos métodos de avaliação e execução que usam o módulo de subprocesso podem levar a comportamentos não intencionais se você não tomar cuidado com o que está sendo usado nas expressões.

Conclusão

Os métodos de avaliação e EXEC permitem processar e executar pedaços de código python. Você pode fornecer declarações de avaliação para outras funções do Python como argumentos, pois eles sempre retornam um valor, um pouco semelhantes às funções Lambda no Python. Da mesma forma, você pode usar a função EXEC para executar o código Python predefinido. É mais comumente usado onde o código python é necessário para ser lido de um arquivo e executado em outro.