Quelles sont les différences entre ces deux fragments de code ?
Utilisation de type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
En utilisant isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Voici un exemple où isinstance
réalise quelque chose que type
ne peut pas faire :
class Vehicle:
pass
class Truck(Vehicle):
pass
dans ce cas, l'objet camion est un Véhicule, mais vous obtiendrez ceci :
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.
En d'autres termes, isinstance
est vrai pour les sous-classes, aussi.
Voir aussi : https://stackoverflow.com/q/707674/1341006
Cette dernière solution est préférable, car elle permet de gérer correctement les sous-classes. En fait, votre exemple peut être écrit encore plus facilement car le second paramètre de isinstance()
peut être un tuple :
if isinstance(b, (str, unicode)):
do_something_else()
ou, en utilisant la classe abstraite basestring
:
if isinstance(b, basestring):
do_something_else()
Selon la documentation python, voici une déclaration :
8.15. types - Noms des types intégrés
À partir de Python 2.2, les fonctions intégrées intégrées telles que
int()
etstr()
.str()
sont aussi des noms pour les > types correspondants. types correspondants.
Ainsi, isinstance()
doit être préféré à type()
.