Existe uma maneira simples de determinar se uma variável é uma lista, dicionário, ou outra coisa? Estou recebendo de volta um objeto que pode ser de qualquer um dos tipos e preciso ser capaz de dizer a diferença.
Para obter o tipo de um objeto, você pode utilizar a função embutida type()
. Passar um objeto como o único parâmetro irá retornar o tipo de objeto desse objeto:
>>> type([]) is list
True
>>> type({}) is dict
True
>>> type('') is str
True
>>> type(0) is int
True
>>> type({})
<type 'dict'>
>>> type([])
<type 'list'>
Isto, claro, também funciona para tipos personalizados:
>>> class Test1 (object):
pass
>>> class Test2 (Test1):
pass
>>> a = Test1()
>>> b = Test2()
>>> type(a) is Test1
True
>>> type(b) is Test2
True
Note que type()
só retornará o tipo imediato do objeto, mas não será capaz de lhe falar sobre a herança do tipo.
>>> type(b) is Test1
False
Para cobrir isso, você deve utilizar a função isinstance. Isto, claro, também funciona para tipos embutidos:
>>> isinstance(b, Test1)
True
>>> isinstance(b, Test2)
True
>>> isinstance(a, Test1)
True
>>> isinstance(a, Test2)
False
>>> isinstance([], list)
True
>>> isinstance({}, dict)
True
A 'isinstância()é normalmente a forma preferida de garantir o tipo de um objeto, pois também aceita tipos derivados. Então a menos que você realmente precise do tipo de objeto (por qualquer razão), utilizar
isinstance()é preferido em vez de
type()`.
O segundo parâmetro de isinstance()
também aceita um tuple de tipos, portanto é possível verificar vários tipos ao mesmo tempo. A isinstância
irá então retornar verdadeiro, se o objeto for de qualquer um desses tipos:
>>> isinstance([], (tuple, list, set))
True
Pode ser mais Pythonic para utilizar um bloco "tentar"...`exceto'. Dessa forma, se você tem uma classe que faz quacks como uma lista, ou quacks como uma ditadura, ela se comportará corretamente independentemente do seu tipo really.
Para esclarecer, o método preferido de "dizer a diferença" entre os tipos de variáveis é com algo chamado duck typing: desde que os métodos (e tipos de retorno) a que uma variável responde sejam os que a sua subrotina espera, trate-a como você espera que ela seja. Por exemplo, se você tem uma classe que sobrecarrega os operadores de parênteses com getattr
e setattr
, mas utiliza algum esquema interno engraçado, seria apropriado que ela se comportasse como um dicionário, se é isso que ela está tentando emular.
O outro problema com o type(A)' é do tipo(B)
verificando que se A' é uma subclasse de
B', ele avalia para falso' quando, programmaticamente, você esperaria que ele fosse
verdadeiro'. Se um objeto é uma subclasse de uma lista, ele deve funcionar como uma lista: verificando o tipo como apresentado na outra resposta irá evitar isso. (No entanto, a isinstância
funcionará).