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í?


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.


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.


22

Esto parece funcionar para mí:

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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.