Python pra dev TS: diferenças mentais críticas
⏱ 10 min·⭐ 40 XP
Ao terminar: Você reconhece os pontos onde o modelo mental de TypeScript trava em Python — GIL, duck typing, escopo — antes de escrever o primeiro bug por causa deles.
Mapa mental TS ↔ Python
| TypeScript | Python | Observação |
|---|---|---|
| interface User {} | TypedDict / dataclass / Pydantic | Pydantic é o Zod |
| type Status = "ok" | "err" | Literal["ok", "err"] | Precisa importar typing.Literal |
| async/await | async/await + asyncio | Similar; needs event loop explícito |
| npm install | uv add | uv é o padrão moderno |
| package.json | pyproject.toml | PEP 621 |
| node_modules | .venv | Um por projeto, gitignored |
| vitest | pytest | pytest domina Python |
| eslint + prettier | ruff | ruff é tudo-em-um (Rust) |
| tsc | mypy / pyright | pyright mais rápido |
| zod | pydantic v2 | Blazing (escrito em Rust) |
TypeScriptinterface User {}
PythonTypedDict / dataclass / Pydantic
ObservaçãoPydantic é o Zod
TypeScripttype Status = "ok" | "err"
PythonLiteral["ok", "err"]
ObservaçãoPrecisa importar typing.Literal
TypeScriptasync/await
Pythonasync/await + asyncio
ObservaçãoSimilar; needs event loop explícito
TypeScriptnpm install
Pythonuv add
Observaçãouv é o padrão moderno
TypeScriptpackage.json
Pythonpyproject.toml
ObservaçãoPEP 621
TypeScriptnode_modules
Python.venv
ObservaçãoUm por projeto, gitignored
TypeScriptvitest
Pythonpytest
Observaçãopytest domina Python
TypeScripteslint + prettier
Pythonruff
Observaçãoruff é tudo-em-um (Rust)
TypeScripttsc
Pythonmypy / pyright
Observaçãopyright mais rápido
TypeScriptzod
Pythonpydantic v2
ObservaçãoBlazing (escrito em Rust)
🗺️ O mesmo conceito, dois nomes — o mapa que evita reaprender do zero
TypeScript
interface / typeForma estática, só existe em tempo de compilação
↓
undefined / nullDois jeitos de dizer "sem valor", com regra própria de cada um
↓
Promise + async/awaitConcorrência via event loop de uma thread só
Python
Protocol / TypedDict + PydanticProtocol é estrutural como interface; Pydantic valida em RUNTIME, TS não valida nada em runtime
↓
NoneUm valor só para "sem valor" — mais simples, menos distinção que aprender
↓
asyncio + async/awaitMesma ideia de event loop, sintaxe quase idêntica — a transferência é direta aqui
Armadilhas comuns
# Truthiness é mais agressivo
if []: ... # False (array vazio é falsy)
if 0: ... # False
if None: ... # False
if '': ... # False
# Em TS só null/undefined/false/0/""/NaN são falsy; array vazio é TRUTHY
# Default mutable é ARMADILHA CLÁSSICA
def add(item, items=[]): # ❌ items é compartilhado entre calls
items.append(item)
return items
def add(item, items=None): # ✅ correto
if items is None: items = []
items.append(item)
return items
# Comprehensions em vez de map/filter
doubled = [x * 2 for x in nums if x > 0] # pythonic
# map/filter existem mas comprehensions são idiomáticasEscopo LEGB
Python resolve variáveis em ordem: Local → Enclosing → Global → Built-in. Diferente de TS onde let é block-scoped, Python variáveis em for/if ficam disponíveis fora do bloco.
for i in range(10):
temp = i * 2
print(i) # 9 — vazou
print(temp) # 18 — vazou
# Use funções/comprehensions pra escoparQuiz rápido
Qual diferença de modelo mental mais causa erro em quem vem de linguagem tipada?
O que TS dev vai adorar em Python moderno
- Pydantic v2 — Zod blazing fast.
- FastAPI — OpenAPI automático, DI elegante.
- uv — pip/npm moderno em Rust.
- ruff — ESLint+Prettier num binário.
- pytest — DX superior a vitest em alguns aspectos (fixtures, parametrize).
- Jupyter — exploração que TS não tem equivalente bom.
Perguntas frequentes
❓ Quais diferenças mentais mais pegam quem vem de TypeScript?
Tipagem opcional que não é verificada em execução, o modelo de concorrência com trava global do interpretador, e o empacotamento com ambiente virtual em vez de diretório de módulos local. As três produzem surpresa nos primeiros dias, e nenhuma é sobre sintaxe.
❓ A trava global impede paralelismo?
Impede paralelismo de CPU em linhas de execução do mesmo processo — não impede concorrência de entrada e saída, que é a maior parte do trabalho de serviço web. Para CPU, o caminho é processo separado. Versões recentes começaram a oferecer modo sem a trava, ainda em amadurecimento.
❓ Anotação de tipo em Python vale a pena?
Vale muito, com verificador em modo estrito no fluxo de integração — ela pega a mesma classe de defeito que o compilador pega em TypeScript. Sem verificador, a anotação é documentação que envelhece, e é como a maior parte do código anotado acaba.
Fixando
Quiz rápido
O que caracteriza a passagem de argumentos nessa linguagem?
Quiz rápido
Qual prática moderna mais melhora a confiabilidade de um projeto nessa linguagem?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…