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
matematicadeve conter__init__.pyepotencia.py. __init__.pydeve exporpotenciapara quematematica.potenciafuncione.potencia.pydeve ter o blocoif __name__ == "__main__":com a impressão exataTeste: 2 elevado a 3 é 8.main.pydeve imprimir3^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
- Criamos a pasta
matematicae, dentro dela, o arquivo__init__.py. Esse arquivo transforma a pasta em um pacote e define o que é exposto ao importar o pacote. - No
__init__.py, usamosfrom .potencia import potencia. O ponto (.) indica importação relativa: o módulopotenciaestá no mesmo pacote. - No arquivo
potencia.py, definimos a funçãopotenciaque calculabase ** expoente. - Incluímos o bloco
if __name__ == "__main__":. Quando executamospython -m matematica.potencia, o Python define__name__como"__main__"e o teste é impresso. Quando importamos, o bloco é ignorado. - No
main.py, fora do pacote, fazemosimport matematica. Como o__init__.pyimportoupotencia, podemos acessarmatematica.potenciadiretamente. - 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 potenciaem vez defrom .potencia import potencia: dentro do pacote, o correto é a importação relativa.import potenciapode falhar se o módulo não estiver nosys.path. - Executar
python matematica/potencia.pydiretamente: o bloco__main__funciona, mas a importação relativa no__init__.pypode não ser usada. Para testar o pacote, prefirapython -m matematica.potencia. - No
main.py, tentarfrom matematica import potenciasem expor no__init__.py: isso só funciona se__init__.pyimportarpotencia. Se não, usefrom 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