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 geometria com __init__.py expondo todas as funções.
  • areas.py deve ter area_quadrado e area_circulo usando math.pi.
  • perimetros.py deve ter perimetro_quadrado e circunferencia.
  • main.py deve 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

  1. Criamos a pasta geometria e dentro dela os arquivos __init__.py, areas.py e perimetros.py.
  2. No __init__.py, usamos importações relativas para trazer as funções dos submódulos. Assim, ao importar geometria, todas as funções ficam disponíveis diretamente em geometria.
  3. Em areas.py, importamos math para usar math.pi. Definimos area_quadrado (lado ao quadrado) e area_circulo (pi vezes raio ao quadrado).
  4. Incluímos o bloco if __name__ == "__main__": que imprime o teste apenas quando o módulo é executado diretamente (ex.: python -m geometria.areas).
  5. Em perimetros.py, definimos perimetro_quadrado (4 vezes o lado) e circunferencia (2 vezes pi vezes raio). Importamos math dentro da função para demonstrar que também é possível.
  6. No main.py, importamos geometria e chamamos as funções com os valores pedidos, imprimindo no formato exato.
  7. Para criar o ambiente virtual, usamos python -m venv venv e ativamos (no Windows: venv\Scripts\activate; no Linux/macOS: source venv/bin/activate). Depois rodamos python 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 o venv antes de rodar.
  • Erro de importação relativa: se tentar from areas import area_quadrado dentro do pacote, pode ocorrer ModuleNotFoundError. Use from .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 math em areas.py: NameError: name 'math' is not defined. Importe math no 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