Comprobando si type == list en python

185

Puede que tenga un pedo cerebral aquí, pero realmente no puedo entender qué hay de malo en mi código:

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

la salida es <type 'list'>pero la instrucción if nunca se activa. ¿Alguien puede detectar mi error aquí?

Benjamin Lindqvist
fuente
3
¿Has utilizado listcomo variable en alguna parte? Tenga en cuenta que si está trabajando en REPL o tal, aún puede redefinirse desde hace un tiempo.
Ffisegydd
..... Woooowww ... definitivamente una lección sobre las deficiencias de los idiomas tipeados suavemente. Wow ...
Benjamin Lindqvist
Agréguelo como respuestas y lo aceptaré. GRACIAS.
Benjamin Lindqvist
1
Pylint y sus amigos lo ayudarán en el futuro (realmente no llamaría a esto una deficiencia).

Respuestas:

140

Su problema es que ha redefinido listcomo una variable previamente en su código. Esto significa que cuando lo hagas type(tmpDict[key])==list, volverá Falseporque no son iguales.

Dicho esto, en su lugar, debe usarlo isinstance(tmpDict[key], list)al probar el tipo de algo, esto no evitará el problema de sobrescribir, listpero es una forma más pitónica de verificar el tipo.

Ffisegydd
fuente
Agradable. 'más pitónico' es un concepto amplio. solo por el bien de la educación: ¿cuáles son las diferencias entre el tipo y la instancia?
Javi
222

Deberías intentar usar isinstance()

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

En tu caso

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

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"

EDITAR 1: La diferencia entre isinstance()y type()por qué la forma isinstance()más preferida de verificar es que isinstance()verifica las subclases además, mientras type()que no.

codificador d
fuente
22

Esto parece funcionar para mí:

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

Python 3.7.7

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

Aunque no es tan sencillo como isinstance(x, list)uno podría usar también:

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

y me gusta la simple inteligencia de eso

remigiusz boguszewicz
fuente