Quali sono le differenze tra questi due frammenti di codice?
Usando type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Usando isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Ecco un esempio in cui isinstance
ottiene qualcosa che type
non può:
class Vehicle:
pass
class Truck(Vehicle):
pass
in questo caso, un oggetto camion è un Veicolo, ma si ottiene questo:
isinstance(Vehicle(), Vehicle) # returns True
type(Vehicle()) == Vehicle # returns True
isinstance(Truck(), Vehicle) # returns True
type(Truck()) == Vehicle # returns False, and this probably won't be what you want.
In altre parole, isinstance
è vero anche per le sottoclassi.
Vedi anche: https://stackoverflow.com/q/707674/1341006
Quest'ultimo è preferito, perché gestirà correttamente le sottoclassi. In effetti, il tuo esempio può essere scritto ancora più facilmente perché il secondo parametro di isinstance()
'può essere una tupla:
if isinstance(b, (str, unicode)):
do_something_else()
oppure, usando la classe astratta basestring
:
if isinstance(b, basestring):
do_something_else()
Secondo la documentazione di python ecco una dichiarazione:
8.15. tipi - Nomi per i tipi built-in
A partire da Python 2.2, i built-in come
int()
estr()
sono anche nomi per i tipi corrispondenti.
Quindi isinstance()
dovrebbe essere preferito a type()
.