Ver o tipo de uma variável

Publicado em 2010-10-18 por Vinicius Assef

Às vezes precisamos saber com que tipo de dados estamos lidando. Existem algumas formas de fazer isso em Python.

Outro dia lembrei que há um tempo quebrei um pouco a cabeça para descobrir como saber o tipo de uma variável em Python.

Do jeito rápido

É fácil:

s = "texto"
if type(s) is str:
  print ("sou string")

Para checar outros tipos, use tuple, list, dict, int, float ao invés de str.

Esse é o jeito simples, que a gente usa normalmente no shell interativo do Python, mas definitivamente não é a maneira recomendada de usar em seus programas reais.

Do jeito certo

A forma recomendada de checar o tipo de uma variável em Python, é usar a função isinstance(). Ela trata a hierarquia de herança e isso dá mais robustez ao seu programa.

Vamos a um exemplo, definindo duas classes, uma herdando da outra:

>>> class A:
>>>   def __init__(self):
>>>     print 'sou um A'
...
>>>
>>> class B(A):
>>>   def __init__(self):
>>>     print 'sou um B que herdou de A'

Agora vamos instanciá-las:

>>> a = A()
sou um A
>>> b = B()
sou um B que herdou de A
>>> isinstance(a, A)
True
>>> isinstance(b, B)
True

Já que B herdou de A:

>>> isinstance(b, A) # como B herda de A...
True

Mas, se usássemos type():

>>> type(b) is B
True
>>> type(b) is A
False

Isso contraria o conceito básico de orientação a objetos, que diz que se B herda de A, B pode ser usado em todo lugar que A poderia. Ou seja, B é uma especialização de A. Em outras palavras, B é "um tipo" de A.

Portanto, não use type()!

E com tipos nativos?

Funciona do mesmo jeito. Afinal, em Python tudo é objeto:

>>> n = 10
>>> isinstance(n, int)
True

>>> isinstance("a", str)
True

Observação: Só use esses mecanismos se realmente for necessário. Sugiro fortemente você aderir à recomendação do Python, que é pedir perdão ao invés de pedir permissão.

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.