Come controllare il tipo di dati in Python (tipo vs isistanza)

Scopri come controllare i tipi di dati in Python. Comprendi quando utilizzare type() rispetto a isinstance(), gestisci classi personalizzate e scrivi convalide di controllo del tipo sicuro.

Prova questa soluzione nell'editor

Panoramica

Python è un linguaggio tipizzato dinamicamente, il che significa che le variabili possono contenere valori di qualsiasi tipo di dati e il loro tipo può cambiare durante l'esecuzione. Sebbene questa flessibilità acceleri lo sviluppo iniziale, richiede anche la verifica dei tipi di variabili in fase di esecuzione prima di eseguire operazioni specifiche del tipo, come l'esecuzione di operazioni aritmetiche su numeri interi o la chiamata di metodi di stringa.

Per verificare il tipo di dati di un oggetto, Python fornisce due funzioni principali: `type()` e `isinstance()`. La funzione "type(obj)" restituisce il tipo di classe preciso dell'oggetto. Sebbene sia possibile utilizzare `type(obj) == int` per verificare se un numero è un numero intero, questo metodo è generalmente sconsigliato perché non supporta strutture di ereditarietà (una sottoclasse di un numero intero verrebbe valutata come `False`).

Il modo Python consigliato per controllare i tipi è `isinstance(obj, class_info)`. Questa funzione controlla se un oggetto è un'istanza della classe specificata o di qualsiasi sottoclasse ereditata da essa. Supporta anche il controllo rispetto a una tupla di classi (ad esempio, `isinstance(value, (int, float))`), rendendo il codice di convalida altamente flessibile e robusto.

Codice e output di esecuzione

Questo script dimostra il controllo dei tipi di variabile utilizzando sia type() che isinstance(), mostrando le differenze nell'ereditarietà.

check_type.py
Prova nell'editor
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)
Uscita terminale
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

Implementazione passo dopo passo

  • Utilizzare isinstance(variable, type_name) per il controllo generale del tipo (conforme all'ereditarietà).
  • Passa una tupla di tipi come isinstance(variable, (int, float)) per verificare rispetto a più classi.
  • Usa type(variable) is type_name solo quando devi garantire l'esatta corrispondenza della classe, ignorando le sottoclassi.

Domande frequenti

Perché isinstance() è preferito rispetto a type()?

isinstance() supporta l'ereditarietà e il polimorfismo degli oggetti. Se si crea una sottoclasse di un tipo built-in, isinstance() lo riconoscerà correttamente come un'istanza della classe genitore, mentre type() valuterà False.

Come posso verificare se un oggetto è richiamabile (come una funzione)?

Utilizza la funzione incorporata callable(), che restituisce True se l'oggetto può essere richiamato come una funzione.

Argomenti correlati

Risorse Python consigliate

Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.