Verificando se type == list em python

185

Talvez eu esteja tendo um peido cerebral aqui, mas realmente não consigo descobrir o que há de errado com meu código:

for key in tmpDict:
    print type(tmpDict[key])
    time.sleep(1)
    if(type(tmpDict[key])==list):
        print 'this is never visible'
        break

a saída é <type 'list'>mas a instrução if nunca é acionada. Alguém pode detectar meu erro aqui?

Benjamin Lindqvist
fonte
3
Você já usou listcomo variável em algum lugar? Lembre-se de que, se você estiver trabalhando no REPL ou algo assim, ele ainda poderá ser redefinido há algum tempo.
FFisegydd
..... Woooowww ... definitivamente uma lição sobre as deficiências das linguagens de digitação suave. Uau ...
Benjamin Lindqvist
Adicione-o como respostas e eu aceito. OBRIGADO.
Benjamin Lindqvist
1
Pylint e amigos o ajudarão no futuro (eu não chamaria isso de lacuna, na verdade).

Respostas:

140

Seu problema é que você redefiniu listcomo uma variável anteriormente no seu código. Isso significa que quando você fizer type(tmpDict[key])==listisso, retornará Falseporque eles não são iguais.

Dito isto, você deve usar isinstance(tmpDict[key], list)ao testar o tipo de algo, isso não evitará o problema de substituição, listmas é uma maneira mais Python de verificar o tipo.

Ffisegydd
fonte
Agradável. 'mais pitonico' é um conceito amplo. apenas pelo bem da educação: quais são as diferenças entre o tipo e a instância?
Javi
222

Você deveria tentar usar isinstance()

if isinstance(object, list):
       ## DO what you want

No seu caso

if isinstance(tmpDict[key], list):
      ## DO SOMETHING

Para elaborar:

x = [1,2,3]
if type(x) == list():
    print "This wont work"
if type(x) == list:                  ## one of the way to see if it's list
    print "this will work"           
if type(x) == type(list()):
    print "lets see if this works"
if isinstance(x, list):              ## most preferred way to check if it's list
    print "This should work just fine"

EDIT 1: A diferença entre isinstance()e type()por que a isinstance()maneira mais preferida de verificar é que isinstance()verifica as subclasses além disso, enquanto type()não.

codificador-d
fonte
22

Isso parece funcionar para mim:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True
Prometeu
fonte
0

Python 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")
Aravind Krishnakumar
fonte
0

Embora não seja tão simples quanto isinstance(x, list)se poderia usar:

this_is_a_list=[1,2,3]
if type(this_is_a_list) == type([]):
    print("This is a list!")

e eu meio que gosto da esperteza simples disso

remigiusz boguszewicz
fonte