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?


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.


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.


22

Isso parece funcionar para mim:

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


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.