Was sind die Unterschiede zwischen diesen beiden Codefragmenten?
Verwendung von type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Verwendung von isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Hier ist ein Beispiel, bei dem isinstance
etwas erreicht, was type
nicht kann:
class Vehicle:
pass
class Truck(Vehicle):
pass
in diesem Fall ist ein LKW-Objekt ein Fahrzeug, aber man erhält dies:
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.
Mit anderen Worten, isinstance
ist auch für Unterklassen wahr.
Siehe auch: https://stackoverflow.com/q/707674/1341006
Letzteres ist vorzuziehen, weil es Unterklassen richtig behandelt. Tatsächlich kann Ihr Beispiel sogar noch einfacher geschrieben werden, weil der zweite Parameter von "isinstance()" ein Tupel sein kann:
if isinstance(b, (str, unicode)):
do_something_else()
oder, unter Verwendung der abstrakten Klasse basestring
:
if isinstance(b, basestring):
do_something_else()
Gemäß der Python-Dokumentation ist hier eine Anweisung:
8.15. types - Namen für eingebaute Typen
Beginnend mit Python 2.2, werden eingebaute Fabrikfunktionen wie
int()
undstr()
sind auch Namen für die entsprechenden Typen.
Daher sollte isinstance()
gegenüber type()
bevorzugt werden.