obskure Fehlermeldungen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Broetchenholer

obskure Fehlermeldungen

Beitragvon Broetchenholer » Dienstag 26. April 2005, 08:12

Guten Morgen.

Ich habe mir gestern einen halben Tag um die Ohren geschlagen einen Fehler in meinem Python-script zu finden der so gar nicht existiert. Jetzt dachte ich mir vielleicht hat jemand mit mehr Erfahrung in Python die Antwort bereit und ich sitze hier eigentlich an einem bekannten Problem.

Ich habe ein Stück Code das mir eine Liste nach mehrfachauftretenden Werten absuchen soll und diese jeweils in einem Schleifendurchgang bearbeiten soll. Bearbeitete Elemente werden gelöscht und somit kann ich meine listen gruppieren. Das Codestück funktioniert wunderbar wenn ich es alleine laufen lasse. Sobald ich es in die richtige Stelle meiner Anwendung einfüge gibt es mir Fehler aus die ich leider nicht wirklich debuggen kann da es sich dabei um eine Zope-basierte Webanwendung handelt und die einzige Art mir direkt Werte und ähnliches ausgeben zu lassen ist es sie in HTML ausgeben zu lassen. Da komme ich aber gar nicht erst hin. Das verrückte ist das das Codestück an anderen Stellen des Programmes ohne Probleme läuft.

Code: Alles auswählen

item1= ["id","0","bereich",1,"ihbjnrwihbnwpn"]
item2= ["name","blubb","bereich",1,"ihbjnrwihbnwpn"]
itemliste = [item1,item2]

string=""
kopie=itemliste
while kopie:
   tabkopie=kopie[0][2]
   valuestring ="values ("
   string=string+"insert into "+tabkopie+" ("
    i = 0
      while i < len(kopie):
         if tabkopie == kopie[i][2]:
           string=string+kopie[i][0]+","
           valuestring=valuestring+"dtml-sqlvar "+kopie[i][0]+'type="string">,'
           kopie.remove(kopie[i])
         else:
            i=i+1
        string=string+"euser,edate)"
        valuestring=valuestring[0:len(valuestring)-1]+'dtml-sqlvar usertype="string">, now() ) '
        string=string+valuestring


Der einzige Unterschied zum echten Programm sollte eigentlich sein das itemliste am Anfang des Programms deklariert ist. String wurde bereits benutzt. Mein Zope gibt mir nund bei diesem Code einen IndexError zurück. Eigentlich ist der Code zusätzlich in einem try block eingebunden. Allerdings wird keine Exception aufgerufen. fange ich allerdings explizit den IndexError ab zeigt er mir stattdessen einen KeyError mit Fehlerwert=update an. Hm. Fange ich den KeyError ab bekomme ich wieder einen IndexError.

Jemand irgendeine Idee?
Ich würde den Code gerne so lassen aber ein eigentlich nicht existenter Fehler nervt einfach gewaltig und ich kann ieinfach keine Fehlerquelle lokalisieren.

In Vorfreude auf eine kluge Antwort,

der Broetchenholer

Edit (Leonidas): Code in Python Tags gesetzt.
Broetchenholer

Beitragvon Broetchenholer » Dienstag 26. April 2005, 08:40

Und noch ein Update. ich habe im Programm ein weiteres Codestück:

Code: Alles auswählen

string = "select "
for i in range(len(itemliste)):
  string=string+ itemliste[i][2]+"."+itemliste[i][0]+" ,"
string =string[0:len(string)-1]
string=string+ "from "
string=string+itemliste[0][2]+" ,"
bool = 1
for i in range(1,len(itemliste)):
  for j in range(i,0,-1):
    if itemliste[i][2] == itemliste[j-1][2]:
      bool = 0
      break
  if bool == 1:
    string=string+ itemliste[i][2]+" ,"
   
string=string[0:len(string)-1]


Dieses Stück Code nenne ich jetzt Einfach mal Select und das im ersten Posting Insert.

Der "normale" Programmablauf besagt das als erstes Select aufgerufen wird und dann irgendwann später im Programm Insert. Jetzt habe ich ein Bißchen rumgespielt. Vorher wusste ich bereits das Insert ohne Problem läuft wenn es direkt nach Select kommt. Hm. Stelle ich Insert direkt vor Select läuft das Programm wegen dem IndexError nicht. Kommentiere ich Select aus funktioniert allerdings plötzlich Insert wieder. HMMM? Die einzige Variable die die beiden gemeinsam nutzen ist string. Ändere ich string in ustring vfür eine der beiden Abschnitte ändert sich gar nix. Beide Abschnitte laufen über die selben Daten allerdings sind bei Insert diese Saten in einer anderen Variable gespeichert und itemliste wird ja genau einmal zugewiesen in Insert. die Schliefenvariable i wird jedes mal in der Schleife ein neuer Wert zugewiesen, das kanns auch nicht sein.

Edit (Leonidas): Code in Python Tags gesetzt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 26. April 2005, 13:05

Hi Broetchenholer!

1. Bearbeite bitte deine Beiträge und stelle den Code in Python-Tags, damit man den Code mit den richtigen Einrückungen sieht. Falls du nur Code-Tags siehst beim Editieren, dann verwende diese oder schreibe sie per Hand hin. (python) und (/python) mit eckigen statt der runden Klammern.

2. Benenne die Variable "string" in "my_string" um und versuche es dann noch einmal.

3. Handelt es sich um ein Skript, welches direkt im Dateisystem läuft, oder ist es ein Python-Skript, das du direkt in im ZMI (Zope Management Interface) eingegeben hast?

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Beitragvon Gast » Dienstag 26. April 2005, 14:11

Danke @ Leonidas fürs editieren :)

Das Programm ist direkt im ZMI geschrieben.

Ich habe jetzt ein paar Stellen umgebaut und die Funktionsweise geändert so das der Fehler mangels equivalentem Code garantiet nicht mehr auftritt. Allerdings würde ich trotzdem gerne wissen über was gemeckert wird. Ein umbennen der Strings hat übrigens keinerlei Wirkung gezeigt. Ich bin Praktikant hier und darf ein Pythonscript in Zope eingebettet mit datenbankzugriff überarbeiten :/
Dummerweise stehe ich schon vor dem nächsten Problem.

Meiner Index_html wird beim aufruf durch einen Link im Menü ein Parameter mit gegeben den ich dringend brauche um meine Daten wieder zu finden. Nach dem über einige Buttons in andere Scripte gesprungen wird komme ich wieder zu index_html und das Programm meckert das der Parameter nicht übergeben wurde. Natürlich wurde kein Parameter übergeben. ich habe ja nur ein paar Objekte innerhalb des Scripts aufgerufen, lädt er index_html jetzt urplötzlich ganz neu ist der Parameter natürllich weg. Ich denke das passt schon eher in Zope-Forum, man verzeihe mir :(
Wie sorge ich dafür das python (oder Zope) sich diesen Parameter merkt ohne ihn durch sämtliche Aufrufe mitzuschleppen unda danach zu übergeben. Geht das dann mit Return?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Dienstag 26. April 2005, 14:44

Anonymous hat geschrieben: Wie sorge ich dafür das python (oder Zope) sich diesen Parameter merkt ohne ihn durch sämtliche Aufrufe mitzuschleppen unda danach zu übergeben.

Hi!

Wenn du die Daten nicht mitschleppen kannst, dann ist es wohl am einfachsten, die Daten vorübergehend in das Session-Objekt zu speichern.

In einem Python Skript sieht das so aus:

Code: Alles auswählen

# im Session-Objekt speichern
context.REQUEST.SESSION.set("test", "Das sind die Daten")

# Die Daten wieder raus holen
daten = context.REQUEST.SESSION.get("test", default="Keine Daten")

In einer Seitenvorlagen sieht das so aus:

Code: Alles auswählen

# im Session-Objekt speichern
<p tal:define="se request/SESSION;
               dummyvar python:se.set('test', 'Das sind die Daten');"
   tal:condition="nothing"
/>

# Die Daten wieder raus holen
<p tal:content="request/SESSION/test | python:'Keine Daten'" />

Die Daten im Session-Objekt verfallen, wenn der Benutzer 20 (oder 30) min. nichts macht oder wenn der Browser geschlossen wird.


mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Gast

Beitragvon Gast » Dienstag 26. April 2005, 14:57

Template Application Language wird in der Anwendung nicht genutzt, nur dtml, wenn ich das richtig sehe. Meine Kenntnis von Python ist wie gesagt nur sehr klein. Wenn ich das hier jetzt richtig sehe ist Session so ne Art globaler Puffer in Dictionary Form und im unteren Beispiel kann ich durch Angabe des Schlüsselwortes "test" meine Daten eintragen und abfragen. Die Frage ist, wie global ist das ganze? Können sämtliche Bausteine des programms darauf zu greifen?

Auf jeden Fall danke für die schnell Antwort, ich teste das jetzt mal.
BlackJack

Beitragvon BlackJack » Dienstag 26. April 2005, 21:59

Ein Unterschied scheinen ja die Daten zu sein -- kannst Du Dein Quelltextstück mal mit echten Daten für `itemlist` laufen lassen. Ausserhalb von Zope meine ich.

Und eine Kleinigkeit: ``kopie=itemliste`` erzeugt keine Kopie sondern bindet nur den Namen `kopie` and die `itemliste`, das heisst wenn Du aus `kopie` Elemente entfernst, dann verschwinden die auch aus `itemliste`. Die ist also nach der äusseren ``while``-Schleife leer und jeder Zugriff auf ein Element wird mit einem `IndexError` quittiert.

Falls es daran liegen sollte hilft ``kopie = list(itemliste)`` eine (flache) Kopie zu erstellen.
Broetchenholer

Beitragvon Broetchenholer » Mittwoch 27. April 2005, 07:32

Genau das dürfte es dann sein. Ich muss jetzt baer nicht verstehen warum der einfach mal kurz bei lsiten ne Referenz übergibt und bei anderen Objekten nen Wert. Naja ich denke mal jede Sprache muss ihre Haken haben. Danke für die Hilfe.
BlackJack

Beitragvon BlackJack » Mittwoch 27. April 2005, 22:09

In Python werden nie Werte, sondern immer Referenzen auf Objekte übergeben. Das ist ziemlich konsistent und kein "Haken" wie ich finde.

Dein Grundproblem liesse sich übrigens einfacher als die ``while``-Schleifen ausdrücken. In Python 2.4 kannst Du eine kopierte Liste nach dem 3. Element sortieren und dann mit der `itertools.groupby()` Funktion ebenfalls nach dem 3. Element gruppieren lassen:

Code: Alles auswählen

#!/usr/bin/env python2.4
from operator import itemgetter
from itertools import groupby

items = [['id', '0', 'bereich', 1, 'ihbjnrwihbnwpn'],
         ['spam', '42', 'eggs', 2, 'ihbjnrwihbnwpn'],
         ['name', 'blubb', 'bereich', 1, 'ihbjnrwihbnwpn'],
         ['python', '23', 'eggs', 3, 'ihbjnrwihbnwpn']]

sorted_items = sorted(items, key=itemgetter(2))
for key, group in groupby(sorted_items, key=itemgetter(2)):
    print key
    for item in group:
        print '   ', item


Ausgabe:

Code: Alles auswählen

bereich
    ['id', '0', 'bereich', 1, 'ihbjnrwihbnwpn']
    ['name', 'blubb', 'bereich', 1, 'ihbjnrwihbnwpn']
eggs
    ['spam', '42', 'eggs', 2, 'ihbjnrwihbnwpn']
    ['python', '23', 'eggs', 2, 'ihbjnrwihbnwpn']


Was Du mit den Daten machst bzw. machen willst konnte ich aus Deinem Quelltext nicht ersehen, weil `string` am Ende "eigenartig" bis "sinnlos" aussieht. Das ist jedenfalls kein gültiges SQL was da rauskommt.
Breotchenholer

Beitragvon Breotchenholer » Donnerstag 28. April 2005, 15:01

Mein erster Ansatz war so oder so viel zu kompliziert. Im Prinzip gehts darum dynamisch auf eine Web-Maske zu zu greifen über die Manipulationen an einer großen Datenbank ablaufen. Mein Chef hat das ganze statisch programmiert und wollte pro Maske einen Dateisatz anfertigen und die festen Bezeichner dann jeweils austauschen. Als ich anmerkte das man das beiweitem besser programmieren kann hatte ich die Arbeit am Hals genau das zu tun. Die beiden Codeschnipsel da schreiben sich im Prinzip aus ner Liste eine SQL-Anweisung zusammen. Habe aber dann eingesehen das ich es eh nicht schaffe einfach nur an Hand von Variablen die richtigen SQL-Anweisungen zu bauen. Daher sind die SQL anweisungen jetzt fest hinterlegt und ich setze im Programm nur die Variablen in den SQL-String ein und schicke das ganze an den Interpreter. Daher taucht auch das Problem das du mit dem sortieren lösen wolltest nicht mehr auf. Aber trotzdem danke für die Mühe :)

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder