O problema Link para o cabeçalho

Quando uma função só precisa escrever em um stream, tipar o argumento como IO[str] é exagero, já que você está exigindo read, seek, close e todo o resto da interface, mesmo que nunca vá usá-los.

A dica Link para o cabeçalho

A partir do Python 3.14, o módulo io expõe os protocolos Writer[T] e Reader[T]. Eles descrevem só o contrato mínimo (write() ou read()), então qualquer objeto que implemente apenas esse método já satisfaz o tipo.

Antes Link para o cabeçalho

1
2
3
4
from typing import IO

def dump_json(tax_list: list[OperationResult], output: IO[str]) -> None:
    ...

Depois Link para o cabeçalho

1
2
3
4
from io import Writer

def dump_json(tax_list: list[OperationResult], output: Writer[str]) -> None:
    ...

Na linha 3, a assinatura passa a dizer exatamente o que a função faz, fica mais fácil de testar (basta um stub com write()) e aceita mais objetos legítimos.

De onde veio o exemplo Link para o cabeçalho

O trecho acima vem do capital_gains/cli.py, parte de uma refatoração de um teste técnico onde explorei técnicas mais avançadas de Python. Se quiser ver o contexto completo do projeto, a apresentação está aqui.

Então é isso pessoal!

Até a próxima!

{}’s