Optional, Union e o Operador |
Unions expressam valores que podem assumir múltiplos tipos. A sintaxe X | Y (3.10+) substitui Union[X, Y]; tipos anuláveis são uniões com None.
Busque em todas as páginas da documentação
|Unions expressam valores que podem assumir múltiplos tipos. A sintaxe X | Y (3.10+) substitui Union[X, Y]; tipos anuláveis são uniões com None.
def parse_count(raw: str | None) -> int:
if raw is None:
return 0
return int(raw)
def format_id(value: int | str) -> str:
return str(value)Quando usar isso:
from dataclasses import dataclass
@dataclass
class User:
id: int
email: str | None
def email_domain(user: User) -> str | None:
if user.email is None:
return None
return user.email.split("@", 1)[1]
def describe(value: int | str | None) -> str:
match value:
case None:
return "ausente"
case int(n):
return f"número {n}"
case str(s):
return f"texto {s}"
def coalesce(*values: str | None) -> str:
for v in values:
if v is not None:
return v
return ""
if __name__ == "__main__":
print(describe(42))
print(email_domain(User(1, None)))O que isso demonstra:
is None / is not None estreita tipos opcionais para verificadoresmatch/case com padrões tipados refina uniõesstr | None em argumentos variádicos para cadeias de fallbackNone explicitamente no tipo de retornoOptional[T] significa T | None - ainda válido, | é o estilo preferido.mypy --strict avisa sobre membros de união não tratados em match.| Ferramenta | Exemplo |
|---|---|
is None | Optional -> T |
isinstance | Membros da Union |
match/case | Estrutural + tipos |
assert | Dica apenas para o verificador |
from typing import TypeGuard
def is_str_list(val: list[object]) -> TypeGuard[list[str]]:
return all(isinstance(x, str) for x in val)if email: trata a string vazia como ausente de forma diferente de is None. Correção: Escolha semântica explícita de None vs. falsy.T | None obscurece campos obrigatórios. Correção: Separar campos de modelo obrigatórios e opcionais.None em Python - valide na fronteira com Pydantic.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
Tipos Result/Either | Canal de erro explícito | Exceções são idiomáticas |
Literal | Conjunto fixo de valores | Tipos de finalidade aberta |
| exceções | Falta verdadeiramente excepcional | Campo opcional esperado |
| objeto sentinela | Distinguir ausente vs None | Optional mais simples é suficiente |
Mesmo significado - prefira str | None em bases de código Python 3.10+ modernas.
isinstance, match, igualdade a None, ou funções TypeGuard.
isinstance(x, (int, str)) é válido em tempo de execução; o verificador estreita de acordo.
field: str | None = None ou Optional com padrão None.
int | None substitui Optional[int] - leitura mais limpa.
Inclua case _: ou mypy pode avisar sobre union não tratada em configurações estritas.
User | Admin com Protocol compartilhado ou classe base para campos comuns.
Campos Optional do Pydantic mapeiam para null; documente nullable do OpenAPI cuidadosamente.
assert x is not None estreita para mypy - sem operação em tempo de execução se otimizações removerem asserts (-O).
Refatore para classe base, Protocol, ou union discriminada com campo de tag literal.
Versões da Pilha: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+ e uv 0.6+.
Revisado por Chris St. John·Última atualização: 16 de jul. de 2026