Проверка, если type == список в Python

186

Возможно, у меня тут пукнет мозг, но я действительно не могу понять, что не так с моим кодом:

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

вывод, <type 'list'>но оператор if никогда не срабатывает. Кто-нибудь может определить мою ошибку здесь?

Бенджамин Линдквист
источник
3
Вы использовали listкак переменную где-нибудь? Имейте в виду, что если вы работаете в REPL или что-то в этом роде, оно может быть переопределено некоторое время назад.
Ffisegydd
..... Woooowww ... определенно урок, касающийся недостатков мягко типизированных языков. Ух ты ...
Бенджамин Линдквист
Добавьте это как ответы, и я приму. СПАСИБО.
Бенджамин Линдквист
1
Pylint и друзья помогут вам в будущем (я бы не назвал это недостатком, правда).

Ответы:

140

Ваша проблема заключается в том, что вы ранее переопределили listпеременную в своем коде. Это означает, что когда вы делаете type(tmpDict[key])==list, вернется, Falseпотому что они не равны.

При этом вы должны вместо этого использовать isinstance(tmpDict[key], list)при тестировании типа чего-либо, это не избежит проблемы с перезаписью, listно является более питонским способом проверки типа.

Ffisegydd
источник
Ницца. «Больше Pythonic» - это широкое понятие. только ради образования: каковы различия между типом и происхождением?
Хави
222

Вы должны попробовать использовать isinstance()

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

В твоем случае

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

Разработать:

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"

РЕДАКТИРОВАТЬ 1: Разница между isinstance()и type()почему isinstance()наиболее предпочтительный способ проверки заключается в том, что isinstance()проверяет подклассы дополнительно, а type()не делает.

д-кодер
источник
22

Кажется, это работает для меня:

>>>a = ['x', 'y', 'z']
>>>type(a)
<class 'list'>
>>>isinstance(a, list)
True
Прометей
источник
1

Python 3.7.7

import typing
if isinstance([1, 2, 3, 4, 5] , typing.List):
    print("It is a list")
Аравинд Кришнакумар
источник
0

Хотя не так просто, как isinstance(x, list)можно было бы также использовать:

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

и мне нравится простая хитрость этого

Remigiusz Boguszewicz
источник