Seite 1 von 1

TypeError: unpack non-sequence

Verfasst: Montag 19. November 2007, 17:29
von nemomuk
Hallo,

ich bekomme von einer Datenbankanfrage folgendes 2-dimensionales Tupel zurück und verarbeite es folgendermaßen:

Code: Alles auswählen

((id, 'kategorie', 'wo', 'was', 'preis'), es folgend weitere Einträge)

for ausgabe1 in result_ausgabe:
		print ausgabe1
		for id,kategorie3,wo,was,preis in ausgabe1:
			global ausgabe
			ausgabe += """
					<tr>\n
						<td><input type='checkbox' name='check_""" + id + """' /></td>
						<td>""" + kategorie3 + """</td>
						<td>""" + wo + """</td>
						<td>""" + was + """</td>
						<td>""" + preis + """</td>
					</tr>\n"""
Nun gibt er mir als Fehler: TypeError: unpack non-sequence zurück...

Was ist da falsch?

Vielen Dank!

Verfasst: Montag 19. November 2007, 17:37
von Rebecca

Code: Alles auswählen

>>> (a, b) = (1, 2) # geht
>>> (a, b) = 1 # geht nicht, da 1 keine Sequenz ist
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
TypeError: unpack non-sequence
Uebrigens ist der Bezeichner 'id' nicht gut gewaehlt, weil du dir damit eine built-in-Funktion ueberschreibst.

Verfasst: Montag 19. November 2007, 17:41
von nemomuk
wie mach ich das dann, dass das eine sequenz ist?

Verfasst: Montag 19. November 2007, 17:47
von BlackJack
Dann ist da so ein hässliches ``global`` und wiederholtes ``+=`` auf Zeichenketten kann recht ineffizient werden.

Zeichenkettenformatierung ist im allgemeinen übersichtlicher und speziell bei HTML sollte man sowieso besser ein Template-System benutze, das zum Beispiel dafür sorgt, dass auf jeden Fall gültiges (X)HTML herauskommt.

Verfasst: Montag 19. November 2007, 17:49
von Rebecca
Ich rate mal: Zeile 5 muss heissen:

Code: Alles auswählen

id,kategorie3,wo,was,preis = ausgabe1
Ist natuerlich bei den spaerlichen Informationen, die du uns gibst, schwer zu sagen.

Ach ja, und global ist boese!

Verfasst: Montag 19. November 2007, 17:54
von nemomuk
also zu meinen Informationen:
Ich bekomme aus einer Datenbank ein Tupel zurück:
bsp: ((1, 'qwe', 'wer', 'ert', 'rtz'), (2, 'sdfg', 'dfg', 'fgh', 'ghj'))

so, nun will ich die einzelnen Werte per for-Schleife auslesen:

Code: Alles auswählen

for ausgabe1 in result_ausgabe:
        print ausgabe1
        for id1,kategorie,wo,was,preis in ausgabe1:
            global ausgabe
            ausgabe += """
                    <tr>\n
                        <td><input type='checkbox' name='check_""" + id1 + """' /></td>
                        <td>""" + kategorie + """</td>
                        <td>""" + wo + """</td>
                        <td>""" + was + """</td>
                        <td>""" + preis + """</td>
                    </tr>\n"""
und will für die "innere" Tupel nicht nochmal umständlich eine "normale" for-Schleife machen, sondern die Einträge schon vorbenennen, da ich ja die Anzahl des inneren Tupels kenne... (id1,kategorie,wo,was,preis)

Jetzt klar?

Danke!

Verfasst: Montag 19. November 2007, 17:58
von Rebecca
Dann habe ich ja richtig geraten. Entweder du machst eine innere for-Schleife, um ueber alle Elemente zu iterieren, oder du holst dir alle Elemente auf einen Schwung mit id,kategorie3,wo,was,preis = ausgabe1. So wie es ist ist es doppelt gemoppelt.

Verfasst: Montag 19. November 2007, 18:05
von BlackJack
@SchneiderWeisse: Das war schon vorher klar. Aber wenn dieser Fehler kommt, dann hast Du ganz offensichtlich *kein* Tupel. Oder irgendeine andere Sequenz.

Wie sieht denn der komplette Traceback aus? Und was gibt ``print ausgabe1`` bzw. ein ``print type(ausgabe1), repr(ausgabe1)`` aus?

Verfasst: Montag 19. November 2007, 18:27
von nemomuk
also ich bedanke mich...

Mit Rebeccas Methode geht es!