HOWTO · Python

Controlla il tipo di variabile in Python

Scopri come controllare il tipo di un valore in Python con le funzioni `type()` e `isinstance()`.

In questa pagina

Usa type(value) per conoscere il tipo del valore oppure isinstance(value, SomeType) per verificare se appartiene a un tipo, comprese le sottoclassi. In Python, le variabili sono nomi associati a oggetti: si controlla quindi il valore, non un tipo di variabile dichiarato.

Le variabili e i loro tipi in Python

Un nome in Python fa riferimento a un oggetto, che ha un tipo. Assegnando un valore, associ un nome a quell’oggetto: non devi dichiarare in anticipo il tipo del nome. Per esempio, 42, 3.5, "hello", True e [1, 2] sono rispettivamente valori di tipo int, float, str, bool e list. In seguito, lo stesso nome può fare riferimento a un oggetto di un altro tipo.

Controllare il tipo di una variabile in Python

Per un controllo rapido, passa il valore a type(); usa isinstance() quando nel codice ti serve un test del tipo che restituisca un valore booleano. L’esempio seguente mostra entrambi gli approcci con un intero e una stringa. È un esempio autonomo: eseguilo con Python per vedere i risultati stampati.

count = 50
label = "Ada"

print(type(count))
print(type(label))
print(isinstance(count, int))
print(isinstance(label, int))
<class 'int'>
<class 'str'>
True
False

Usare la funzione type() per controllare il tipo di una variabile in Python

La funzione integrata type() restituisce l’oggetto tipo del valore che le passi. Quando vengono stampati, i tipi integrati più comuni appaiono in forme come <class 'int'>, <class 'float'> e <class 'str'>. Questo è utile per esaminare un valore durante il debug o per scegliere un comportamento in base al suo tipo esatto.

Per esempio, type(50) è int, type(10.5) è float e type("Ada") è str. Chiamare type() indica che cos’è un oggetto, ma non lo converte in un altro tipo.

Usare la funzione isinstance() per controllare il tipo di una variabile in Python

Usa isinstance(value, classinfo) per ottenere True o False a seconda che value sia un’istanza della classe o delle classi specificate. A differenza del confronto diretto tra il risultato di type(value) e una classe, isinstance() riconosce anche le sottoclassi. È quindi adatto ai controlli che devono accettare una classe e le sue classi derivate.

class Animal:
    pass

class Dog(Animal):
    pass

pet = Dog()
print(isinstance(pet, Dog))
print(isinstance(pet, Animal))
print(type(pet) is Dog)
True
True
True

In questo esempio, entrambi i controlli con isinstance() restituiscono vero perché Dog deriva da Animal; anche il confronto del tipo esatto è vero perché pet è stato creato come Dog. Usa type(value) is SomeType solo quando è davvero necessario che il tipo corrisponda esattamente. Controllare il tipo o verificare un’istanza non cambia il tipo del valore.

Questa distinzione è utile quando una funzione è progettata per lavorare con una classe base e con gli oggetti specializzati che ne derivano. Per esempio, il codice che accetta un Animal spesso può gestire un Dog tramite la stessa interfaccia, quindi isinstance(pet, Animal) esprime questo contratto. Un controllo esatto come type(pet) is Animal rifiuterebbe invece un Dog, anche se eredita da Animal. Riserva i controlli del tipo esatto ai casi in cui le sottoclassi devono essere trattate diversamente o non sono supportate; nel normale codice polimorfico, il controllo che considera le sottoclassi è in genere più flessibile.