Spec Sistemas Com Python • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


🎯 Nível 1: Fundamentos

Problema 10.1 — Definição de Protocol com typing.Protocol (Structural Subtyping)

Contexto: Definição de Protocol com typing.Protocol (Structural Subtyping) no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.

Requisitos de Execução:

  1. Criar contrato Renderizavel(Protocol) e passar objetos que implementem render() -> str sem herança explícita.

Resultado Esperado

Duck typing estático validado pelo Mypy.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_1_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol

class Renderizavel(Protocol):
    def render(self) -> str:
        ...

class Botao:
    def render(self) -> str:
        return "<button>Enviar</button>"

def exibir_na_tela(comp: Renderizavel) -> None:
    print("UI Component:", comp.render())

exibir_na_tela(Botao())

🔍 Nível 2: Prática

Problema 10.2 — Protocolos em Runtime com o Decorador @runtime_checkable

Contexto: Protocolos em Runtime com o Decorador @runtime_checkable no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.

Requisitos de Execução:

  1. Habilitar checagem dinâmica com isinstance(obj, MeuProtocol) decorando com @runtime_checkable.

Resultado Esperado

Verificação de protocolos realizada dinamicamente em tempo de execução.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_2_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol, runtime_checkable

@runtime_checkable
class Fechavel(Protocol):
    def fechar(self) -> None:
        ...

class Conexao:
    def fechar(self) -> None:
        print("Conexao encerrada.")

c = Conexao()
print(f"Conexao satisfaz Fechavel: {isinstance(c, Fechavel)}")

⚡ Nível 3: Integração

Problema 10.3 — Protocolos Genéricos e Composição de Protocolos

Contexto: Protocolos Genéricos e Composição de Protocolos no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.

Requisitos de Execução:

  1. Declarar Repositorio[T](Protocol) com métodos genéricos de busca e persistência.

Resultado Esperado

Contrato genérico de repositório satisfeito por adaptadores de memória e banco.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_3_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol, TypeVar

T = TypeVar("T")

class Repositorio(Protocol[T]):
    def obter_por_id(self, id: int) -> T | None:
        ...

class UsuarioMemoriaRepo:
    def obter_por_id(self, id: int) -> str | None:
        return f"User_{id}"

repo: Repositorio[str] = UsuarioMemoriaRepo()
print(f"Recuperado: {repo.obter_por_id(10)}")

🏆 Nível 4: Desafio Corporativo

Problema 10.4 — Subtipagem Nominal vs Estrutural em Arquitetura Limpa

Contexto: Subtipagem Nominal vs Estrutural em Arquitetura Limpa no contexto de Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático.

Requisitos de Execução:

  1. Substituir interfaces rígidas por Protocols desacoplando a camada de regras de negócio das bibliotecas externas.

Resultado Esperado

Camadas de domínio 100% desacopladas de drivers e frameworks.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_10_4_SeuNome
  2. Envie na tarefa: Atividade Cap 10 - Polimorfismo Estrutural com typing.Protocol e Duck Typing Estático
🔑 Gabarito de Código & Solução Comentada
from typing import Protocol

class GatewayPagamento(Protocol):
    def cobrar(self, valor: float) -> bool:
        ...

class MockGateway:
    def cobrar(self, valor: float) -> bool:
        return True

def efetuar_checkout(gateway: GatewayPagamento, total: float) -> str:
    return "Sucesso" if gateway.cobrar(total) else "Falha"

print("Checkout:", efetuar_checkout(MockGateway(), 100.0))

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos