Questão nº 38
Questão de Tecnologia da Informação · FGV ALEP 2024 (nº 38)
Considere o código a seguir que é usado para capturar a sintaxe de diversos tipos de frase a ser usado.

A saída correta desse código é
Vai
Vai
Você
- Avou a praia
- Bvou
- Cvou vai
- DEu
- ERetorna erro (alternativa correta)
Resposta comentada
Gabarito Alternativa E
O conceito-chave aqui é como a função exec() do Python interpreta strings de código e como as f-strings (formatted string literals) interpolam valores. exec() tenta executar uma string como se fosse código Python, e se essa string não for sintaticamente válida ou referenciar nomes não definidos, ela levantará um erro. As f-strings inserem o valor de uma variável diretamente na string, sem adicionar aspas automaticamente, o que pode levar a problemas de sintaxe quando o valor é uma frase.
- (A) Incorreta: Esta seria a saída se
exec('print("vou a praia")')fosse executado, mas a forma como a f-string é usada gera umSyntaxError. - (B) Incorreta: Esta não é a saída completa do programa, nem a resposta correta para a questão.
- (C) Incorreta: Esta não é a saída completa do programa, nem a resposta correta para a questão.
- (D) Incorreta: Esta não é a saída completa do programa, nem a resposta correta para a questão.
- (E) Correta: O código retorna erro no sentido de que as chamadas à função
exec()levantam exceções (SyntaxErrorouNameError), mesmo que essas exceções sejam capturadas e tratadas pelos blocostry-except. A pegadinha da banca é que a questão afirma a saída real do código ("Vai\nVai\nVocê"), mas essa saída não é uma das alternativas. Em vez disso, a alternativa correta se refere ao fato de que erros são gerados internamente durante a execução doexec(), mesmo que o programa não "crashe" e imprima as mensagens dos blocosexcept.- Quando
capture_syntax("vou a praia")é chamado,exec(f'print({frase})')se tornaexec('print(vou a praia)'). Isso gera umSyntaxErrorporquevou a praianão é um argumento válido paraprint()sem aspas ou sendo uma variável definida. O blocoexcept SyntaxErroré ativado, imprimindo "Vai". - Similarmente, para
capture_syntax("vai"),exec('print(vai)')também gera umSyntaxError, imprimindo "Vai". - Para
capture_syntax("Eu"),exec('print(Eu)')gera umNameError(assumindo queEunão é uma variável definida). UmNameErroré umaExceptiongeral, mas não umSyntaxError. Portanto, o blocoexcept Exceptioné ativado, imprimindo "Você". - Assim, o código realmente imprime "Vai\nVai\nVocê", mas como essa opção não está disponível, a alternativa "Retorna erro" é a mais adequada, indicando que a execução do código dentro do
exec()falha, levantando exceções que são então tratadas.
- Quando
Fonte: FGV ALEP 2024 Analista Legislativo - Desenvolvedor de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.