Médio Python
Verificação segura com isinstance e None
Enunciado
Escreva uma função descrever(valor) que retorne uma string descrevendo o valor recebido. Se for None, retorne "sem valor". Se for bool, retorne "booleano". Se for int ou float, retorne "número". Se for str, retorne "texto". Para qualquer outro tipo, retorne "desconhecido". Imprima o resultado para os valores None, True, 3, 2.5, "oi" e [1, 2].
Requisitos
- Usar
isinstancepara checar os tipos. - Tratar
boolantes deint, poisboolé subclasse deint. - Comparar com
Noneusandois. - Imprimir uma linha por valor testado.
Código inicial
def descrever(valor):
# complete aqui
pass
for v in [None, True, 3, 2.5, "oi", [1, 2]]:
print(descrever(v))
Saída esperada
sem valor
booleano
número
número
texto
desconhecido
Ver dica
A ordem dos if importa: True também é int, então verifique bool primeiro.
Mostrar solução
def descrever(valor):
# None é comparado com is, não com ==.
if valor is None:
return "sem valor"
# bool precisa vir antes de int: bool é subclasse de int.
if isinstance(valor, bool):
return "booleano"
if isinstance(valor, (int, float)):
return "número"
if isinstance(valor, str):
return "texto"
return "desconhecido"
for v in [None, True, 3, 2.5, "oi", [1, 2]]:
print(descrever(v))
Passo a passo
- A função recebe
valore o primeiro teste évalor is None, que captura o caso especial. - Em seguida checamos
isinstance(valor, bool): comoTrueé instância deboole também deint, essa ordem evita classificá-lo como número. isinstance(valor, (int, float))aceita uma tupla de tipos, cobrindo inteiros e floats de uma vez.isinstance(valor, str)trata textos.- Qualquer outro tipo cai no
return "desconhecido". - O laço percorre a lista e imprime o resultado de cada chamada.
Por que funciona
isinstance respeita a hierarquia de classes, então precisamos ordenar as verificações do mais específico para o mais genérico. Usar is None é idiomático e imune a classes que sobrescrevem __eq__. A função não altera o valor recebido, apenas inspeciona seu tipo em tempo de execução.
Erros comuns
- Colocar
isinstance(valor, int)antes debool:Trueseria classificado como"número". Corrija invertendo a ordem. - Usar
valor == None: funciona, masis Noneé o padrão recomendado. - Esquecer o
return "desconhecido": a função devolveriaNonepara listas, imprimindoNoneem vez de"desconhecido".
Outra forma de resolver
Usando um dicionário de tipos:
def descrever(valor):
if valor is None:
return "sem valor"
if isinstance(valor, bool):
return "booleano"
mapa = {int: "número", float: "número", str: "texto"}
return mapa.get(type(valor), "desconhecido")
É preferível quando há muitos tipos, mas perde subclasses (por isso bool continua tratado antes).
Saída esperada
sem valor
booleano
número
número
texto
desconhecido