💻 Exemplos: Capítulo 13: Generics (Generic[T]), Tabelas Hash, Conjuntos (set) e Dicionários (dict)
Especialização em Sistemas com Python 3.12+ • Capítulo 13
🎯 Demonstração Prática: Repositório Genérico Tipado e Auditoria de ACL com Álgebra de Sets
O exemplo abaixo combina programação genérica com estruturas hash de alta performance:
- Implementação de um repositório genérico em memória (
RepositorioGenerico[T]) com busca indexada em tempo $O(1)$. - Emprego de álgebra de conjuntos (
set) com operadores|,&,-para auditoria de permissões e controle de acesso baseado em papéis (RBAC). - Estatísticas de acessos utilizando
collections.Countere agregação comcollections.defaultdict.
"""
demonstracao_generics_e_hash.py
Repositório Genérico Tipado, Álgebra de Conjuntos (Sets) e Análise de Acessos com Hash.
Compatível com Python 3.12+.
"""
from __future__ import annotations
from collections import Counter, defaultdict
from dataclasses import dataclass, field
from datetime import datetime, timezone
from typing import Final, Generic, Iterator, TypeVar
import uuid
# ==============================================================================
# 1. ESTRUTURA GENÉRICA DE REPOSITÓRIO (PEP 484 / PEP 695)
# ==============================================================================
T = TypeVar("T")
class RepositorioGenerico(Generic[T]):
"""Repositório genérico de entidades indexadas por UUID em tempo O(1)."""
def __init__(self) -> None:
self._indices: dict[str, T] = {}
def inserir(self, chave: str, entidade: T) -> None:
if chave in self._indices:
raise KeyError(f"Identificador já existente no repositório: {chave}")
self._indices[chave] = entidade
def obter(self, chave: str) -> T | None:
return self._indices.get(chave)
def remover(self, chave: str) -> bool:
return self._indices.pop(chave, None) is not None
def __len__(self) -> int:
return len(self._indices)
def __iter__(self) -> Iterator[T]:
return iter(self._indices.values())
# ==============================================================================
# 2. MODELO DE DOMÍNIO E AUDITORIA DE CONTROLE DE ACESSO (RBAC)
# ==============================================================================
@dataclass(slots=True)
class PerfilAcesso:
id_usuario: str
nome: str
departamento: str
privilegios_ativos: set[str] = field(default_factory=set)
# Conjuntos Globais de Conformidade Corporativa
PRIVILEGIOS_SENSIVEIS: Final[set[str]] = {
"FINANCEIRO_LIQUIDAR",
"ROOT_ACESSO_BANCO",
"EXPORTAR_DADOS_LGPD",
"MODIFICAR_AUDITORIA"
}
PRIVILEGIOS_PADRAO_TI: Final[set[str]] = {
"CONSULTA_LOGS",
"REINICIAR_CONTAINER",
"EXPORTAR_DADOS_LGPD"
}
def auditar_privilegios(usuario: PerfilAcesso) -> dict[str, set[str] | bool]:
"""Analisa a postura de segurança do usuário através de álgebra de conjuntos."""
privs = usuario.privilegios_ativos
# Operações de Conjunto em tempo O(1)
sensiveis_concedidos = privs & PRIVILEGIOS_SENSIVEIS # Interseção
privilegios_nao_conformes = sensiveis_concedidos - PRIVILEGIOS_PADRAO_TI # Diferença
possui_todos_padrao = PRIVILEGIOS_PADRAO_TI <= privs # Subconjunto
return {
"sensiveis_ativos": sensiveis_concedidos,
"privilegios_excessivos": privilegios_nao_conformes,
"possui_baseline_completo": possui_todos_padrao,
"alerta_seguranca": len(privilegios_nao_conformes) > 0
}
# ==============================================================================
# 3. EXECUÇÃO DEMONSTRATIVA
# ==============================================================================
if __name__ == "__main__":
print("=" * 80)
print(" REPOSITÓRIO GENÉRICO E AUDITORIA DE CONJUNTOS (HASH SETS)")
print("=" * 80)
# 1. Utilizando o repositório genérico tipado
repositorio_usuarios: RepositorioGenerico[PerfilAcesso] = RepositorioGenerico()
u1 = PerfilAcesso("USR-01", "Mariana Costa", "Segurança da Informação", {
"CONSULTA_LOGS", "REINICIAR_CONTAINER", "EXPORTAR_DADOS_LGPD", "ROOT_ACESSO_BANCO"
})
u2 = PerfilAcesso("USR-02", "Lucas Albuquerque", "Suporte N1", {
"CONSULTA_LOGS"
})
u3 = PerfilAcesso("USR-03", "Beatriz Fontes", "Controladoria Financeira", {
"FINANCEIRO_LIQUIDAR", "EXPORTAR_DADOS_LGPD"
})
repositorio_usuarios.inserir(u1.id_usuario, u1)
repositorio_usuarios.inserir(u2.id_usuario, u2)
repositorio_usuarios.inserir(u3.id_usuario, u3)
print(f">> Total de perfis cadastrados no repositório: {len(repositorio_usuarios)}")
print("-" * 80)
# 2. Auditoria de Segurança com Álgebra de Sets
for perfil in repositorio_usuarios:
parecer = auditar_privilegios(perfil)
print(f"Colaborador : {perfil.nome} ({perfil.departamento})")
print(f"Privilégios : {perfil.privilegios_ativos}")
print(f"Críticos (&) : {parecer['sensiveis_ativos']}")
if parecer["alerta_seguranca"]:
print(f" ⚠️ ALERTA : Privilégios fora do padrão de TI: {parecer['privilegios_excessivos']}")
else:
print(" 🟢 STATUS : Postura de segurança em conformidade.")
print("-" * 80)
# 3. Análise Estatística de Privilégios com Counter e defaultdict
print(">> Histograma de Concessão de Privilégios com Counter:")
todos_privilegios = [priv for p in repositorio_usuarios for priv in p.privilegios_ativos]
contador_privs = Counter(todos_privilegios)
for priv_nome, ocorrencias in contador_privs.most_common():
print(f" * {priv_nome:<25} : Concedido a {ocorrencias} usuário(s)")
# Agrupamento por departamento com defaultdict
usuarios_por_dept: defaultdict[str, list[str]] = defaultdict(list)
for p in repositorio_usuarios:
usuarios_por_dept[p.departamento].append(p.nome)
print("\n>> Distribuição por Departamento (defaultdict):")
for dept, nomes in usuarios_por_dept.items():
print(f" * {dept:<28} : {', '.join(nomes)}")
print("=" * 80)