Médio Python

Pacote com `__init__.py` e execução como script

Enunciado

Crie um pacote chamado matematica com um arquivo __init__.py que importa a função potencia do módulo potencia.py (que você deve criar). A função potencia(base, expoente) retorna base ** expoente. No arquivo potencia.py, inclua um bloco if __name__ == "__main__": que imprime Teste: 2 elevado a 3 é 8 quando o módulo é executado diretamente. Em um arquivo main.py fora do pacote, importe matematica e use matematica.potencia(3, 4) para imprimir o resultado no formato 3^4 = 81.

Requisitos

  • O pacote matematica deve conter __init__.py e potencia.py.
  • __init__.py deve expor potencia para que matematica.potencia funcione.
  • potencia.py deve ter o bloco if __name__ == "__main__": com a impressão exata Teste: 2 elevado a 3 é 8.
  • main.py deve imprimir 3^4 = 81.

Código inicial

# matematica/__init__.py
# TODO: importe a função potencia

# matematica/potencia.py
# TODO: defina potencia e o bloco __main__

# main.py
# TODO: importe matematica e use potencia

Saída esperada

3^4 = 81
Ver dica

No __init__.py, use from .potencia import potencia (importação relativa). Para testar o módulo diretamente, rode python -m matematica.potencia e veja a saída de teste.

Mostrar solução
# matematica/__init__.py
from .potencia import potencia
# matematica/potencia.py
def potencia(base, expoente):
    return base ** expoente

if __name__ == "__main__":
    print("Teste: 2 elevado a 3 é", potencia(2, 3))
# main.py
import matematica

print(f"3^4 = {matematica.potencia(3, 4)}")

Passo a passo

  1. Criamos a pasta matematica e, dentro dela, o arquivo __init__.py. Esse arquivo transforma a pasta em um pacote e define o que é exposto ao importar o pacote.
  2. No __init__.py, usamos from .potencia import potencia. O ponto (.) indica importação relativa: o módulo potencia está no mesmo pacote.
  3. No arquivo potencia.py, definimos a função potencia que calcula base ** expoente.
  4. Incluímos o bloco if __name__ == "__main__":. Quando executamos python -m matematica.potencia, o Python define __name__ como "__main__" e o teste é impresso. Quando importamos, o bloco é ignorado.
  5. No main.py, fora do pacote, fazemos import matematica. Como o __init__.py importou potencia, podemos acessar matematica.potencia diretamente.
  6. Chamamos matematica.potencia(3, 4) e imprimimos com f-string no formato pedido.

Por que funciona

O __init__.py é executado quando o pacote é importado. Ao importar potencia dentro dele, o nome fica disponível no namespace do pacote. O bloco __main__ separa o código de teste da definição, permitindo que o módulo seja usado como biblioteca sem efeitos colaterais.

Erros comuns

  • Esquecer o __init__.py: o Python pode não reconhecer a pasta como pacote (em versões antigas) ou a importação relativa falha. Sempre inclua __init__.py.
  • Usar import potencia em vez de from .potencia import potencia: dentro do pacote, o correto é a importação relativa. import potencia pode falhar se o módulo não estiver no sys.path.
  • Executar python matematica/potencia.py diretamente: o bloco __main__ funciona, mas a importação relativa no __init__.py pode não ser usada. Para testar o pacote, prefira python -m matematica.potencia.
  • No main.py, tentar from matematica import potencia sem expor no __init__.py: isso só funciona se __init__.py importar potencia. Se não, use from matematica.potencia import potencia.

Outra forma de resolver

Se não quiser usar importação relativa no __init__.py, pode deixá-lo vazio e no main.py fazer:

from matematica.potencia import potencia
print(f"3^4 = {potencia(3, 4)}")

Isso é preferível quando você quer importar diretamente o submódulo sem expor no pacote.

Saída esperada

3^4 = 81