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_idade e aceitar idade: int | None.
  • O retorno deve ser anotado como str.
  • Se idade for None, 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

  1. A função formata_idade recebe idade anotada como int | None, indicando que pode ser inteiro ou nulo.
  2. O retorno é anotado como str.
  3. Verificamos se idade is None; se sim, retornamos a mensagem padrão.
  4. Caso contrário, usamos uma f-string para montar "Idade: X anos".
  5. Chamamos a função com 30 e com None, 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 de is None — funciona, mas não é idiomático e pode falhar com objetos que sobrescrevem __eq__.
  • Esquecer de tratar o None e tentar formatar diretamente: f"Idade: {idade} anos" — se idade for None, imprime "Idade: None anos".
  • Anotar como int e passar None — 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