[!info] Referencia rapida e longa (cerca de 20 pgs equivalentes) cobrindo conceitos chave de Python, PyQt6 e integrações usadas no projeto MDB2SQL. Tudo em Markdown plain-Obsidian.
-
- Fundamentos de Python Moderno
-
- Ambiente, Virtualenvs e uv
-
- Tipagem Estatica Pratica (mypy, pyright)
-
- Estruturas de Dados Essenciais
-
- Funcoes, Closures e Decorators
-
- Orientacao a Objetos Idiomatica
-
- Gerenciamento de Erros e Context Managers
-
- Concurrency em Python (threads, asyncio, multiprocess)
-
- I/O, Pathlib e Streams de Dados
-
- Manipulacao de Dados com DuckDB e DataFrames
-
- FFI e Integracao com Rust/Go
-
- Logging, Observabilidade e CLI Tools
-
- Testes Automatizados (pytest) e Fixtures
-
- Performance: Perfis, Vetorizacao e Caches
-
- Distribuicao: Nuitka/PyInstaller e Empacotamento
-
- PyQt6: Ciclo de Vida da Aplicacao
-
- PyQt6: Layouts, Widgets e Estilos
-
- PyQt6: Signals/Slots, Threads e Tasks Longas
-
- Arquitetura de Aplicacao e Padroes de Estado
-
- Segurança, Configuracao e Boas Praticas de Equipe
-
- Roteiro de Estudos e Cheatsheets Relacionados
- CPython 3.11+ com melhorias de velocidade e PAT (precise line numbers).
- PEP8 para estilo; black/ruff como formatadores/linters consistentes.
- Operadores modernos: walrus (
if (val := func())), pattern matching (match), f-strings, comprehensions com condicionais. - Mutabilidade: listas/dicts mutaveis; tuplas/frozenset imutaveis; usar
dataclassesoupydanticpara dados estruturados. - Imutabilidade defensiva para configs carregadas de JSON.
- Separar deps via venv (
python -m venv .venv) ou usar uv (uv synccria/usa .venv). uv.lockgarante reproducao; usar grupos opcionais via[project.optional-dependencies].- Scripts em
[project.scripts]ou[tool.uv]conforme necessidade. - Variaveis de ambiente em
.env; carregar compython-dotenvquando necessario sem hardcode. - Estrutura de pastas recomendada:
src/com pacote raiz,tests/paralelo.
- Use type hints em funcoes publicas e contratos de camada GUI/backend.
typingbasico:list[str],dict[str, Any],Optional[T],TypedDict.- Protocolos para DuckDB adapters e interfaces de servico.
- mypy configs:
disallow_untyped_defs = True,warn_return_any = Truepara manter contrato. - Tipos literais para chaves de tabela/campos evitam erros em queries string-based.
- List/dict comprehensions para filtros rapidos em memoria.
dequepara buffers de eventos UI;heapqpara ranking de resultados.dataclassespara linhas de tabela exibidas;slots=Truereduz memoria.EnumeStrEnumpara estados de UI (Idle, Loading, Error).pathlib.Pathpara paths multiplataforma e seguro vs strings cruas.
- Funcoes tratadas como valores; usar closures para capturar estado local controlado.
- Decorators de memoizacao (
functools.lru_cache) em funcoes puras de leitura. - Decorators customizados para medir tempo de queries ou registrar erros.
- Partial application (
functools.partial) util para conectar slots com contexto.
- Composicao > heranca: widgets especializados recebem helpers em vez de subclassar profundamente.
@dataclasspara DTOs;attrsse precisar de validacao e conversao automatica.- Propriedades com validacao leve para estados sensiveis (db_path, table_name).
- Uso consciente de mixins em UI (ex: MixIn de shortcuts de teclado).
try/exceptcom excecoes especificas (duckdb.Error,OSError).- Sempre feche conexoes:
with duckdb.connect(path) as conn:. - Defina excecoes de dominio (ex:
DatabaseNotFound,InvalidMapping). - Use context managers para locks de threads (
threading.Lock()viawith lock:).
- CPU-bound =>
multiprocessingou extensoes (Rust/Go via FFI). I/O-bound =>threading/concurrent.futures. ThreadPoolExecutorpara consultas paralelas em duckdb read-only; mantenha conexoes isoladas por thread.- Evite interagir com widgets fora da main thread; use sinais/slots ou
QMetaObject.invokeMethod. - Asyncio e PyQt6: integrar via
QEventLoopouasyncqtquando necessario, mas preferir QThread para simplicidade.
Path.glob('*.mdb')para descobrir bancos rotativos; ordene por timestamp/numero.- Leitura de JSON configs com
json.loads(Path.read_text()); validar schema antes de usar. - Stream de CSV para importacoes:
with open(...) as f: reader = csv.DictReader(f); evite carregar tudo em memoria. - Controle de codificacao: usar UTF-8 sempre (
encoding='utf-8').
- Conexoes read-only para UI; write isolado em pipelines offline.
- Queries parametrizadas:
conn.execute("SELECT * FROM tbl WHERE field LIKE ?", [pattern]). - Conector para pandas/polars:
df = conn.execute(query).df(); use para rendering rapido. - Views temporarias (
CREATE VIEW) para juntar bancos rotativos sem copiar. - Indexacao logica: criar colunas derivadas com
GENERATEDdentro de schema padrao.
ctypes/cffipara chamar libs Rust/Go quando performance exigir.- Defina interface C-stable (tipos primitivos, slices) e mantenha funcoes puras e reentrantes.
- Converta DataFrames para Arrow/Parquet para trafegar entre linguagens sem copiar muito.
- Cuidados: GIL continua ativo; libs nativas devem liberar GIL (
Py_BEGIN_ALLOW_THREADS).
- Use
loggingcom dictConfig; niveis: DEBUG para dev, INFO padrao, ERROR para excecoes. - Append-only logs em
logs/app.log; rotacao comRotatingFileHandler. - CLI auxiliares em
scripts/comargparse/typerpara tarefas offline. - Rastreamento de tempo:
time.perf_counter(); decoradores de metrica.
- Estrutura:
tests/unit,tests/integration; nome de arquivostest_*.py. - Fixtures para conexoes DuckDB isoladas (
tmp_path+ base dummy). - Use
pytest-qtpara testar sinais/slots e interacao basica de UI sem janela real. - Marcar testes pesados com
@pytest.mark.slow; coletar cobertura compytest --cov.
- Perfil rapido com
cProfile+snakevizpara hotspots. - Evite loops Python sobre muitas linhas; delegue a DuckDB/pandas.
- Cache de resultados recentes em
functools.lru_cacheoucachetools.TTLCache. - Use
py-spyouperfem prod-like; para UI travada procure funcoes longas na main thread.
- Nuitka: melhor performance e obfuscacao leve; use plugin PyQt6.
- PyInstaller: mais tolerante a deps dinamicas; configure
--add-datapara arquivos config. - Testar binarios em sandbox antes de distribuir; revisar tam. final e dependencia de libc.
- Versionamento semantico via
__version__central.
- Estrutura tipica:
QApplicationcriado emmain.py.- Construir
MainWindowcom componentes, carregar preferencias. - Conectar sinais, iniciar workers, exibir janela e chamar
app.exec().
- Fechamento: interceptar
closeEventpara salvar estado e fechar conexoes DuckDB. - Icones e assets via
QResourceou paths relativos; evitar caminhos absolutos.
- Layouts:
QVBoxLayout/QHBoxLayoutpara compor;QGridLayoutpara tabelas de filtros. - Widgets principais do projeto:
QTableViewcomQAbstractTableModel,QLineEditpara busca,QComboBoxpara bancos/anos. - Estilos com QSS: aplicar no app (
app.setStyleSheet(...)) ou por widget. - Responsividade: usar
setSectionResizeMode(QHeaderView.Stretch)para tabelas adaptarem.
- Conectar botoes a slots:
button.clicked.connect(self.on_click). - QThread pattern:
class Worker(QThread):
finished = pyqtSignal(object)
error = pyqtSignal(Exception)
def __init__(self, query):
super().__init__()
self.query = query
def run(self):
try:
data = run_query(self.query)
self.finished.emit(data)
except Exception as exc:
self.error.emit(exc)- Use
QRunnable+QThreadPoolpara varias tasks sem muitas threads manuais. - Nunca atualizar UI fora da thread principal; envie dados e deixe o slot aplicar no modelo.
- Separar camadas:
backend/(servicos),ui/(widgets),shared/(tipos/constantes). - Model-View-Model (Qt) com modelos baseados em dados; evita copiar listas inteiras.
- Estado global em objeto
AppStatecom referencias a configuracao, conexao atual e preferencia de UI. - Eventos de dominio (busca concluida, diff pronto) propagados por sinais customizados.
- Guard rails: validacao de entrada antes de atingir DuckDB; mapeamentos de colunas vindos de
config/.
- Sanitizar entradas de busca; nunca concatenar SQL direto.
- Preferir arquivos de config somente leitura dentro de
config/; escrever apenas emdata/ou~/.local/share/mdb2sql. - Logs nao devem conter dados sensiveis de usuarios.
- Checklists de PR: lint, testes, review de threads, review de UI freeze.
- Documentar decisoes em
docs/outemp/para replicabilidade.
- Sequencia sug. (em horas aproximadas):
- Revisar PEP8 + idioms (1h)
- PyQt6 basico: layouts, sinais (3h)
- DuckDB e pandas (3h)
- ThreadPoolExecutor + QThread (2h)
- Empacotar com Nuitka/PyInstaller (2h)
- Testes com pytest/pytest-qt (2h)
- Cheatsheets rapidas:
- DuckDB:
ATTACH 'file.duckdb' (READ_ONLY); SHOW TABLES;. - PyQt6 modelos: implementar
rowCount,columnCount,data,headerData. - Typing:
type Alias = dict[str, str]; usarTypedDictpara records.
- DuckDB: