Desafio Python
Ambiente virtual e pacote com submódulos
Enunciado
Crie um ambiente virtual chamado venv e ative-o. Dentro dele, crie um pacote geometria com os módulos areas.py e perimetros.py. O módulo areas.py deve ter area_quadrado(lado) e area_circulo(raio) (use math.pi). O módulo perimetros.py deve ter perimetro_quadrado(lado) e circunferencia(raio). O __init__.py deve importar todas as funções. No arquivo main.py, importe geometria e imprima os resultados para um quadrado de lado 3 e um círculo de raio 2, no formato:
Área quadrado: 9
Perímetro quadrado: 12
Área círculo: 12.566370614359172
Circunferência: 12.566370614359172
Inclua um bloco if __name__ == "__main__": em areas.py que imprime Teste área quadrado: 4 quando executado diretamente.
Requisitos
- Criar e ativar um ambiente virtual (pode ser via terminal, mas o código deve funcionar dentro dele).
- Pacote
geometriacom__init__.pyexpondo todas as funções. areas.pydeve terarea_quadradoearea_circulousandomath.pi.perimetros.pydeve terperimetro_quadradoecircunferencia.main.pydeve imprimir exatamente as quatro linhas especificadas.
Código inicial
# geometria/__init__.py
# TODO: importe as funções
# geometria/areas.py
# TODO: defina as funções e o bloco __main__
# geometria/perimetros.py
# TODO: defina as funções
# main.py
# TODO: importe geometria e imprima os resultados
Saída esperada
Área quadrado: 9
Perímetro quadrado: 12
Área círculo: 12.566370614359172
Circunferência: 12.566370614359172
Ver dica
No __init__.py, use from .areas import area_quadrado, area_circulo e from .perimetros import perimetro_quadrado, circunferencia. Para o círculo, use math.pi * raio ** 2.
Mostrar solução
# geometria/__init__.py
from .areas import area_quadrado, area_circulo
from .perimetros import perimetro_quadrado, circunferencia
# geometria/areas.py
import math
def area_quadrado(lado):
return lado ** 2
def area_circulo(raio):
return math.pi * raio ** 2
if __name__ == "__main__":
print("Teste área quadrado:", area_quadrado(2))
# geometria/perimetros.py
def perimetro_quadrado(lado):
return 4 * lado
def circunferencia(raio):
import math
return 2 * math.pi * raio
# main.py
import geometria
lado = 3
raio = 2
print("Área quadrado:", geometria.area_quadrado(lado))
print("Perímetro quadrado:", geometria.perimetro_quadrado(lado))
print("Área círculo:", geometria.area_circulo(raio))
print("Circunferência:", geometria.circunferencia(raio))
Passo a passo
- Criamos a pasta
geometriae dentro dela os arquivos__init__.py,areas.pyeperimetros.py. - No
__init__.py, usamos importações relativas para trazer as funções dos submódulos. Assim, ao importargeometria, todas as funções ficam disponíveis diretamente emgeometria. - Em
areas.py, importamosmathpara usarmath.pi. Definimosarea_quadrado(lado ao quadrado) earea_circulo(pi vezes raio ao quadrado). - Incluímos o bloco
if __name__ == "__main__":que imprime o teste apenas quando o módulo é executado diretamente (ex.:python -m geometria.areas). - Em
perimetros.py, definimosperimetro_quadrado(4 vezes o lado) ecircunferencia(2 vezes pi vezes raio). Importamosmathdentro da função para demonstrar que também é possível. - No
main.py, importamosgeometriae chamamos as funções com os valores pedidos, imprimindo no formato exato. - Para criar o ambiente virtual, usamos
python -m venv venve ativamos (no Windows:venv\Scripts\activate; no Linux/macOS:source venv/bin/activate). Depois rodamospython main.py.
Por que funciona
O __init__.py atua como ponto de entrada do pacote, reunindo as funções dos submódulos. As importações relativas garantem que os módulos internos se refiram uns aos outros corretamente. O bloco __main__ permite testar areas.py isoladamente sem afetar o uso como biblioteca. O ambiente virtual isola as dependências, mas como usamos apenas a biblioteca padrão, ele serve para manter o projeto organizado.
Erros comuns
- Esquecer de ativar o ambiente virtual: o Python pode usar o interpretador global e não encontrar o pacote se ele não estiver no
sys.path. Ative ovenvantes de rodar. - Erro de importação relativa: se tentar
from areas import area_quadradodentro do pacote, pode ocorrerModuleNotFoundError. Usefrom .areas import .... - Não definir
__init__.py: o pacote pode não ser reconhecido em versões mais antigas do Python. Sempre crie o arquivo, mesmo que vazio. - Esquecer de importar
mathemareas.py:NameError: name 'math' is not defined. Importemathno topo do arquivo.
Outra forma de resolver
Se preferir não expor tudo no __init__.py, pode importar os submódulos diretamente no main.py:
from geometria import areas, perimetros
print("Área quadrado:", areas.area_quadrado(3))
print("Perímetro quadrado:", perimetros.perimetro_quadrado(3))
# ...
Isso é útil quando o pacote tem muitos módulos e você quer importar apenas o necessário.
Saída esperada
Área quadrado: 9
Perímetro quadrado: 12
Área círculo: 12.566370614359172
Circunferência: 12.566370614359172