Überprüfen Sie, ob type == list in Python ist

184

Ich habe hier vielleicht einen Hirnfurz, aber ich kann wirklich nicht herausfinden, was mit meinem Code nicht stimmt:

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

Die Ausgabe ist <type 'list'>aber die if-Anweisung wird nie ausgelöst. Kann jemand meinen Fehler hier erkennen?

Benjamin Lindqvist
quelle
3
Haben Sie listirgendwo als Variable verwendet? Beachten Sie, dass wenn Sie in der REPL oder einer anderen arbeiten, diese möglicherweise noch vor einiger Zeit neu definiert wurde.
Ffisegydd
..... Woooowww ... definitiv eine Lektion in Bezug auf die Mängel von sanft getippten Sprachen. Wow ...
Benjamin Lindqvist
Füge es als Antwort hinzu und ich werde akzeptieren. VIELEN DANK.
Benjamin Lindqvist
1
Pylint und Freunde werden dir in Zukunft helfen (ich würde das nicht wirklich als Mangel bezeichnen).

Antworten:

136

Ihr Problem ist, dass Sie listzuvor in Ihrem Code als Variable neu definiert haben . Dies bedeutet, dass wenn Sie dies tun, type(tmpDict[key])==listif zurückkehrt, Falseweil sie nicht gleich sind.

Abgesehen davon sollten Sie stattdessen isinstance(tmpDict[key], list)beim Testen des Typs etwas verwenden. Dies vermeidet nicht das Problem des Überschreibens, listsondern ist eine pythonischere Methode zum Überprüfen des Typs.

Ffisegydd
quelle
Nett. 'mehr Pythonic' ist ein weit gefasstes Konzept. Nur um der Bildung willen: Was sind die Unterschiede zwischen Typ und Instanz?
Javi
219

Sie sollten versuchen, zu verwenden isinstance()

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

In deinem Fall

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

Um dies zu erläutern:

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"
D-Codierer
quelle
22

Das scheint bei mir zu funktionieren:

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