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.