Como verificar o tipo de dados em Python (type vs isinstance)

Aprenda como verificar tipos de dados em Python. Entenda quando usar type() vs isinstance(), lidar com classes personalizadas e escrever validações de verificação de tipo seguras.

Experimente esta solução no Editor

Visão geral

Python é uma linguagem de tipo dinâmico, o que significa que variáveis podem conter valores de qualquer tipo de dados e seu tipo pode mudar durante a execução. Embora essa flexibilidade acelere o desenvolvimento inicial, ela também exige que você verifique os tipos de variáveis ​​em tempo de execução antes de executar operações específicas de tipo, como realizar aritmética em números inteiros ou chamar métodos de string.

Para verificar o tipo de dados de um objeto, Python fornece duas funções principais: `type()` e `isinstance()`. A função `type(obj)` retorna o tipo de classe preciso do objeto. Embora você possa usar `type(obj) == int` para verificar se um número é um número inteiro, esse método geralmente é desencorajado porque não suporta estruturas de herança (uma subclasse de um número inteiro seria avaliada como `False`).

A maneira Python recomendada de verificar tipos é `isinstance(obj, class_info)`. Esta função verifica se um objeto é uma instância da classe especificada ou de qualquer subclasse herdada dela. Ele também suporta verificação em uma tupla de classes (por exemplo, `isinstance(value, (int, float))`), tornando o código de validação altamente flexível e robusto.

Saída de código e execução

Este script demonstra a verificação de tipos de variáveis usando type() e isinstance(), mostrando as diferenças na herança.

value_int = 42
value_str = "hello"

# 1. Checking type using isinstance() (Recommended)
is_number = isinstance(value_int, int)
print(f"Is {value_int} an int? {is_number}")

# Checking against multiple possible types
is_num_or_str = isinstance(value_str, (int, float, str))
print(f"Is '{value_str}' int, float, or str? {is_num_or_str}")

# 2. Checking type using type() (For exact class matches)
print(f"Exact type of value_int: {type(value_int).__name__}")
print("Is value_int exactly an int?", type(value_int) is int)

# 3. Inheritance difference
class CustomList(list):
    pass

my_list = CustomList([1, 2, 3])

print("\nInheritance testing:")
print("isinstance(my_list, list):", isinstance(my_list, list))
print("type(my_list) is list:", type(my_list) is list)
Saída terminal
Is 42 an int? True
Is 'hello' int, float, or str? True
Exact type of value_int: int
Is value_int exactly an int? True

Inheritance testing:
isinstance(my_list, list): True
type(my_list) is list: False

Implementação passo a passo

  • Use isinstance(variable, type_name) para verificação geral de tipo (em conformidade com herança).
  • Passe uma tupla de tipos como isinstance(variable, (int, float)) para verificar múltiplas classes.
  • Use type(variable) is type_name somente quando você precisar garantir a correspondência exata da classe, ignorando as subclasses.

Perguntas frequentes

Por que isinstance() é preferível a type()?

isinstance() suporta herança e polimorfismo de objetos. Se você criar uma subclasse de um tipo integrado, isinstance() irá reconhecê-lo corretamente como uma instância da classe pai, enquanto type() será avaliado como False.

Como posso verificar se um objeto pode ser chamado (como uma função)?

Use a função callable() integrada, que retorna True se o objeto puder ser invocado como uma função.

Tópicos Relacionados

Recursos Python recomendados

Expanda seu conhecimento com tutoriais interativos relacionados, folhas de dicas e comparações de código.