Quais são as diferenças entre estes dois fragmentos de código?
Utilizando type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Utilizando isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Aqui está um exemplo em que a isinstância
alcança algo que o tipo
não consegue:
class Vehicle:
pass
class Truck(Vehicle):
pass
neste caso, um objecto de camião é um Veículo, mas vais ter isto:
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.
Em outras palavras, isinstância
também é verdade para as subclasses.
Veja também: https://stackoverflow.com/q/707674/1341006
Este último é o preferido, porque vai lidar adequadamente com as subclasses. Na verdade, o seu exemplo pode ser escrito ainda mais facilmente porque isinstance()
'o segundo parâmetro pode ser um tuple:
if isinstance(b, (str, unicode)):
do_something_else()
ou, utilizando a classe abstracta `basetring':
if isinstance(b, basestring):
do_something_else()
De acordo com a documentação python aqui é uma declaração:
8.15. tipos - Nomes para tipos incorporados
Começando em Python 2.2, built-in funções de fábrica, tais como
int()
e str()str()
também são nomes para o tipos correspondentes.
Então isinstance()
deve ser preferido em vez de type()`.