Impacto do EXEC nas variáveis locais: um mergulho em
A função Exec, um grampo de python para execução de código dinâmico, apresenta uma dúvida intrigante: Ele pode atualizar variáveis locais dentro de uma função?
o python 3 Dilemma
No Python 3, o seguinte snippet de código falha ao atualizar uma variável local como se poderia esperar:
def f(): a = 1 exec("a = 3") print(a)
em vez do '3' antecipado, ele impressa assustador O mesmo código no Python 2 realmente atualizaria a variável local, imprimindo '3'. Essa disparidade surge de uma mudança fundamental na maneira como o Python lida com variáveis locais. no momento da compilação. Essa eficiência tem o custo de proibir modificações no tempo de execução para os habitantes locais. Assim, a chamada executiva padrão no Python 3 não pode alterar com sucesso as variáveis locais. Passe explicitamente um dicionário local para exec. Este dicionário armazenará as variáveis locais atualizadas após a execução do código dinâmico. O código revisado se parece com o seguinte:
def Foo (): ldict = {} exec ("a = 3", globals (), ldict) a = ldict ['a'] Print (a)
implicações para Exec ()
A documentação do Python 3 mede explicitamente contra a modificação do dicionário padrão () ao usar o Exec, pois pode levar a levar a levar a comportamento imprevisível. Para segurança, deve -se sempre passar por um dicionário local explícito para executar ao pretender atualizar variáveis locais. O relatório de bug destaca que a otimização do Python 3 para variáveis locais levou ao comportamento atual. O compilador, incapaz de distinguir funções executivas personalizadas do próprio Python, não pode oferecer a eles tratamento especial. Portanto, o EXEC padrão não pode alterar os locais. Ele permitiu que as variáveis locais fossem modificadas dinamicamente em virtude do manuseio especial do compilador do exec. Mudança na abordagem para modificar variáveis locais. Ao empregar um dicionário local explícito, os desenvolvedores podem alavancar o poder da execução de código dinâmico, mantendo o controle sobre suas variáveis locais.
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3