typing.Optional
Muita gente acaba utilizando e dizendo que typing.Optional - em funções - é para dizer que o parâmetro é opcional. De fato é, mas dizem no sentido de ter um valor padrão, o que está totalmente errado!
def pow(x, y: Optional[int] = 2) -> int:
return x*y
A assinatura está totalmente errada em comparação à implementação! Você pode até pensar que está certa dizendo algo como:
yé uma parâmetro opcional, se você não passa-lo, ele receberá2.
..mas não tem nada a ver!
Um Optional[T] é equivalente à Union[T, None]
Podemos dizer apenas
T | Nonee, apartir do Python 3.10 usar dessa forma nos códigos!
Ou seja, a assinatura anterior nos diz que podemos passar None ao parâmetro y. Mas a implementação claramente daria erro, então, a assinatura correta para a implementação seria:
def pow(x, y: int = 2) -> int:
Perfeito! Mas e como ficaria a implementação com um Optional[T]? Muito simples.
def pow(x, y: Optional[int] = None) -> int:
if y is None:
return x
return x*y
Quando anotamos um parâmetro dizendo que ele será opcional, estamos na verdade dizendo que a função se comportará totalmente diferente com ou sem o parâmetro - como se fossem flags de CLIs, tipo o -v do docker-compose up!