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.
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à.
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)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: FalseImplementazione 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
Scopri come creare una classe in Python. Padroneggia il costruttore __init__, i metodi di istanza, la parola chiave self e l'istanziazione degli oggetti.
Come gestire le eccezioni in PythonScopri come gestire le eccezioni in Python usando try, tranne, altro e infine blocchi. Scrivi codice Python privo di errori e resistente agli arresti anomali.
Risorse Python consigliate
Espandi le tue conoscenze con tutorial interattivi, foglietti illustrativi e confronti di codici correlati.
Suggerimenti sul tipo Python
Scopri come scrivere suggerimenti sul tipo in Python. Migliora la qualità del codice, abilita il completamento automatico e sfrutta mypy per l'analisi statica del codice.
Foglio informativo sulle conversioni di tipo Python
Impara le conversioni di tipo implicite ed esplicite in Python. Converti tra stringhe, numeri interi, numeri in virgola mobile, elenchi, insiemi e dizionari.
Python vs TypeScript: Scripting dinamico vs Web type-safe
Confronta Python e TypeScript. Scopri di più sui sistemi di tipo strutturale, sui metadati del decoratore, sui controlli del compilatore, sui runtime Web e sugli strumenti per sviluppatori.