18 de outubro de 2010

Ver o tipo de uma variável

Observação 1: Para saber como testar corretamente o tipo de uma variável, leia a atualização desse post, logo abaixo. Eu não recomendo mais usar o type().

Observação 2: 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.


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.

É fácil, ó:
>>> s = 'texto'
>>> if type(s) is str:
...   print 'sou string'

Para checar outros tipos, use tuple, list, dict, int, float, unicode.

Fica aí a dica e sugiro que você faça testes no shell.

Atualização

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 segurança ao seu programa.

>>> class A(object):
>>>   def __init__(self):
>>>     print 'sou um A'
...
>>>
>>> class B(A):
>>>   def __init__(self):
>>>     print 'sou um B que herdou de A'
...
>>>
>>> a = A()
sou um A
>>> b = B()
sou um B que herdou de A
>>> isinstance(a, A)
True
>>> isinstance(b, B)
True
>>> isinstance(b, A) # como B herda de A...
True
>>>

Agora, checando uma variável com um tipo nativo:
>>> n = 10
>>> isinstance(n, int)
True 
>>> 

Para checar o tipo de strings, sugiro testar basestring se você estiver usando Python 2.x, já que as strings normais (str) e as unicode herdam da classe basestring:
>>> s = 'texto'
>>> isinstance(s, basestring)
True
>>> u = u'texto'
>>> isinstance(u, basestring)
True
>>> 

Como no Python 3 todas as strings são Unicode, os tipos basestring e unicode foram removidos e o utilitário de conversão (2to3) transforma todas as ocorrências de basestring para str. Para mais detalhes sobre esse assunto, consulte a seção Text vs data instead of unicode vs 8-bit do manual do Python.

Eu sou Vinicius Assef, um programador do século passado que gosta de Python, pratica Lean Development e acredita em Deus. Você pode me contactar por email ou twitter.

3 comentários:

  1. Ao invés de usar "type(obj) is tipodeobj", use "isinstance(obj, tipodeobj)", que cuida de herança, etc, a não ser que você queira testar o tipo exato.

    ResponderExcluir
  2. Ola...
    gostaria de saber se é possivel testar o tipo do conteudo.

    Por exemplo:
    aVetor = ( 0, "0" )

    Type(aVetor) -> deve resultar Array ou algo parecido.

    Como obter os tipos dos dados dos elementos do vetor?

    E obrigado pelas postagens. Suas dicas são sempre bem vindas.

    Marcelo

    ResponderExcluir
  3. Marchvic, teste o seguinte trecho de código abaixo:

    [code]for item in aVetor: print type(item)[/code]

    Caso vc esteja lidando com objetos e herança, a dica do lauro ajuda bastante.

    ResponderExcluir

Marcadores