Wat zijn de verschillen tussen deze twee codefragmenten?
Met behulp van type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Met behulp van isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Hier's een voorbeeld waar isinstance
iets bereikt wat type
niet kan:
class Vehicle:
pass
class Truck(Vehicle):
pass
in dit geval is een vrachtwagenobject een Voertuig, maar je'krijgt dit:
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.
Met andere woorden, isinstance
is ook waar voor subklassen.
Het laatste heeft de voorkeur, omdat het subklassen goed zal behandelen. In feite kan je voorbeeld nog eenvoudiger geschreven worden omdat isinstance()
's tweede parameter een tuple kan zijn:
if isinstance(b, (str, unicode)):
do_something_else()
of, met behulp van de basestring
abstracte klasse:
if isinstance(b, basestring):
do_something_else()
Volgens de python documentatie is hier een verklaring:
8.15. types - Namen voor ingebouwde types
Beginnend in Python 2.2, ingebouwde fabrieksfuncties zoals
int()
enstr()
ook namen voor de bijbehorende types.
Dus isinstance()
moet de voorkeur krijgen boven type()
.