TypeError: unpack non-sequence

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

TypeError: unpack non-sequence

Beitragvon nemomuk » Montag 19. November 2007, 17:29

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!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 19. November 2007, 17:37

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Montag 19. November 2007, 17:41

wie mach ich das dann, dass das eine sequenz ist?
BlackJack

Beitragvon BlackJack » Montag 19. November 2007, 17:47

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.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 19. November 2007, 17:49

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!
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Montag 19. November 2007, 17:54

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!
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Beitragvon Rebecca » Montag 19. November 2007, 17:58

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.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
BlackJack

Beitragvon BlackJack » Montag 19. November 2007, 18:05

@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?
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Beitragvon nemomuk » Montag 19. November 2007, 18:27

also ich bedanke mich...

Mit Rebeccas Methode geht es!

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder