Qual è il modo canonico di controllare il tipo in Python?

Qual è il modo migliore per controllare se un dato oggetto è di un dato tipo? Che ne dite di controllare se l'oggetto eredita da un dato tipo?

Diciamo che ho un oggetto o. Come faccio a controllare se è un str?

Soluzione

Per controllare se o è un'istanza di str o una qualsiasi sottoclasse di str, usate isinstance (questo sarebbe il modo "canonico"):

if isinstance(o, str):

Per controllare se il tipo di o è esattamente str (escludere le sottoclassi):

if type(o) is str:

Anche la seguente funziona, e può essere utile in alcuni casi:

if issubclass(type(o), str):

Vedere Built-in Functions nella Python Library Reference per informazioni rilevanti.

Un'altra nota: in questo caso, se state usando python 2, potreste effettivamente voler usare:

if isinstance(o, basestring):

perché questo catturerà anche le stringhe Unicode (unicode non è una sottoclasse di str; sia str che unicode sono sottoclassi di basestring). Si noti che basestring non esiste più in python 3, dove c'è una rigida separazione di stringhe (str) e dati binari (bytes).

In alternativa, isinstance accetta una tupla di classi. Questo restituirà True se x è un'istanza di qualsiasi sottoclasse di qualsiasi (str, unicode):

if isinstance(o, (str, unicode)):
Commentari (6)

isinstance(o, str) restituirà True se o è un str o è di un tipo che eredita da str.

type(o) is str restituirà True se e solo se o è uno str. Restituirà False se o è di un tipo che eredita da str.

Commentari (3)