Namespaces, Pilha de Programa e Tratamento de Exceções em Python

Questões sobre o assunto

1. Considere o código abaixo:
def f(y):
    x = 2
    print(f"x={x}, y={y}")
    g(3)

def g(y):
    x = 4
    print(f"x={x}, y={y}")

Qual será a saída ao executar f(1)?

1.50 pontos Média

Resposta correta: A) x=2, y=1
x=4, y=3

Explicação: f tem seu próprio namespace (x=2, y=1). Dentro de f chama g(3), que cria outro namespace (x=4, y=3).

2. Qual das alternativas descreve corretamente a ordem de busca de um nome em Python?
2.50 pontos Difícil

Resposta correta: C) Local → Global → Built‑ins

O interpretador procura primeiro no namespace local da chamada, depois no global (módulo) e, por fim, nos built‑ins.

3. Analise o módulo example.py abaixo:
# example.py
def f():
    print('f')
def g():
    print('g')
x = 10

Se o módulo for importado com from example import *, qual será o conteúdo de dir() no módulo chamador?

2.50 pontos Difícil

Resposta correta: A) ['f', 'g', 'x']

O wildcard importa todos os nomes que não começam com “_”. Assim, f, g e x ficam no namespace do chamador.

4. Considere o seguinte trecho:
def safe_open(nome, modo):
    try:
        arq = open(nome, modo)
        return arq
    except:
        return None

f = safe_open('inexistente.txt', 'r')
if f is None:
    print('Falha ao abrir')
else:
    print('Arquivo aberto')

Qual é o comportamento correto desse código quando o arquivo não existe?

3.50 pontos Extrema

Resposta correta: B) Imprime “Falha ao abrir”.

Quando open falha, a exceção é capturada, safe_open devolve None e o if imprime a mensagem.

Pontuação Total
0.00