Médio Python
União com pipe e Optional
Enunciado
Crie uma função formata_idade que recebe um int | None e retorna uma str. Se a idade for None, retorne "Idade não informada"; caso contrário, retorne "Idade: X anos". Use a sintaxe de união com |.
Requisitos
- A função deve se chamar
formata_idadee aceitaridade: int | None. - O retorno deve ser anotado como
str. - Se
idadeforNone, retornar"Idade não informada". - Caso contrário, retornar
"Idade: X anos"com o valor de X.
Código inicial
def formata_idade(idade):
# complete aqui
pass
print(formata_idade(30))
print(formata_idade(None))
Saída esperada
Idade: 30 anos
Idade não informada
Ver dica
Use if idade is None: para tratar o caso nulo e f-string para formatar a string.
Mostrar solução
def formata_idade(idade: int | None) -> str:
if idade is None:
return "Idade não informada"
return f"Idade: {idade} anos"
print(formata_idade(30))
print(formata_idade(None))
Passo a passo
- A função
formata_idaderecebeidadeanotada comoint | None, indicando que pode ser inteiro ou nulo. - O retorno é anotado como
str. - Verificamos se
idade is None; se sim, retornamos a mensagem padrão. - Caso contrário, usamos uma f-string para montar
"Idade: X anos". - Chamamos a função com
30e comNone, imprimindo os resultados.
Por que funciona
A sintaxe int | None é açúcar sintático para Optional[int] e é suportada a partir do Python 3.10. O mypy entende que dentro do if idade is None, o tipo de idade é None, e no else é int. Isso permite acessar idade sem erros de tipo.
Erros comuns
- Usar
if idade == None:em vez deis None— funciona, mas não é idiomático e pode falhar com objetos que sobrescrevem__eq__. - Esquecer de tratar o
Nonee tentar formatar diretamente:f"Idade: {idade} anos"— seidadeforNone, imprime"Idade: None anos". - Anotar como
inte passarNone— mypy acusaria erro.
Outra forma de resolver
Usar Optional[int] do módulo typing:
from typing import Optional
def formata_idade(idade: Optional[int]) -> str:
...
Prefira | em Python 3.10+.
Saída esperada
Idade: 30 anos
Idade não informada