Controllare se una variabile è un intero o no

Come faccio a controllare se una variabile è un intero?

Soluzione

Se avete bisogno di fare questo, fate

isinstance(, int)

a meno che non siate in Python 2.x, nel qual caso volete

isinstance(, (int, long))

Non usate type. Non è quasi mai la risposta giusta in Python, poiché blocca tutta la flessibilità del polimorfismo. Per esempio, se sottoclassate int, la vostra nuova classe dovrebbe registrarsi come int, cosa che type non farà:

class Spam(int): pass
x = Spam(0)
type(x) == int # False
isinstance(x, int) # True

Questo aderisce al forte polimorfismo di Python: si dovrebbe permettere qualsiasi oggetto che si comporti come un int, invece di imporre che lo sia.

MA...

La mentalità classica di Python, però, è che è più facile chiedere perdono che permesso. In altre parole, non controllate se x è un intero; assumete che lo sia e catturate l'eccezione se non lo è:

try:
    x += 1
except TypeError:
    ...

Questa mentalità sta lentamente venendo superata dall'uso di classi base astratte, che ti permettono di registrare esattamente quali proprietà dovrebbe avere il tuo oggetto (aggiungere? moltiplicare? raddoppiare?) facendolo ereditare da una classe appositamente costruita. Questa sarebbe la soluzione migliore, dato che permetterà esattamente quegli oggetti con gli attributi necessari e sufficienti, ma dovrete leggere la documentazione su come usarla.

Commentari (14)
>>> isinstance(3, int)
True

Vedi qui per saperne di più.

Si noti che questo non aiuta se si cercano attributi simili a int. In questo caso potreste anche voler controllare per long:

>>> isinstance(3L, (long, int))
True

Ho visto controlli di questo tipo contro un tipo di array/indice nel sorgente Python, ma non credo che sia visibile al di fuori del C.

Token SO reply: Sei sicuro che dovresti controllare il suo tipo? O non passare un tipo che non puoi gestire, o non cercare di superare in astuzia i tuoi potenziali riutilizzatori di codice, potrebbero avere una buona ragione per non passare un int alla tua funzione.

Commentari (8)

Ho trovato una domanda correlata qui su SO stesso.

Gli sviluppatori Python preferiscono non controllare i tipi ma fare un'operazione specifica del tipo e catturare un'eccezione TypeError. Ma se non si conosce il tipo allora si ha quanto segue.

>>> i = 12345
>>> type(i)

>>> type(i) is int
True
Commentari (3)