Fehleranalyse bei execfile()

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.
Antworten
flex
User
Beiträge: 5
Registriert: Montag 1. März 2004, 13:58
Wohnort: Ulm
Kontaktdaten:

Montag 1. März 2004, 14:05

Hallo Leute!

Folgendes:
Ich habe 2 Dateien: a.py und b.py
In a.py sind Strukturen vorhanden wie zb (Datei-Auszug):

Code: Alles auswählen

 {'collist': [72, 83],
   'maxcol': 83,
   'maxrow': 76,
   'mincol': 72,
   'minrow': 58,
   'trackid': 'Oval_1',
   'type': 'rect'}
In b.py sind entsprechende Strukturen definiert wie zb (Datei-Auszug):

Code: Alles auswählen

class MAPPING(StructuredType):
  """MAPPING(domain, range) -> mapping type t

  'domain' and 'range' must be stypes

  x in t <=>  all k in x : (k in domain) and (x[k] in range)
  """

  def __init__(self, domain_type, range_type):
    self.domainType = domain_type
    self.rangeType = range_type

  def __contains__(self, arg):
    global _depthlevel
    _depthlevel+=1
    if not isinstance(arg, type({})):
      msg="ERROR (MAPP): %s is not a mapping (dicctionary)"%short(arg)
      _add_msg(msg)
      _depthlevel-=1
      return 0
    for key, val in arg.iteritems():
      if key not in self.domainType:
        msg="ERROR (MAPP): %s is not of domain type %s"%(short(key),repr(self.domainType))
        _add_msg(msg)
        _depthlevel-=1
        return 0
      if val not in self.rangeType:
        msg="ERROR (MAPP): %s is not of range type %s"%(short(key),repr(self.rangeType))
        _add_msg(msg)
        _depthlevel-=1
        return 0
    _depthlevel-=1
    return 1
In b.py lese ich die Datei a.py ein und will sie überprüfen, ob sie auf meine Struktur passt, zb:

Code: Alles auswählen

test = {}
execfile("a.py", {}, test)
assert test in MAPPING
Wenn jetzt was in a.py nicht stimmt (also die Struktur nicht mit meiner Definition übereinstimmt), bekomme ich einen AssertionError, den ich abfangen kann und von dem ich alles weiss (sys.exc_info())
Ich würde aber gern an die Zeilennummer in der eingelesenen a.py kommen, wo der Fehler auftrat.
Das Problem ist nur, dass mir execfile() keine Fehler ausspuckt, weil die Syntax ja stimmt, aber die Struktur halt nicht...

Ich hoffe das Problem wurde verstanden und es hat vielleicht jemand eine Idee :-)

Besten Dank schonmal und Grüsse
Felix
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 1. März 2004, 16:03

Hi flex,

also irgendwie werde ich aus dem Ganzen nicht so recht schlau.

Code: Alles auswählen

test = {}
execfile("a.py", {}, test)
assert test in MAPPING 
was macht "a.py" genau, der Ausschnitt sagt darüber nichts, was bekommst Du ins Dictionary "test" und wozu übergibst Du ein leeres Dictionary?
Warum testest Du ob test in der Klasse MAPPING ist? MAPPING ist doch eine Klasse?


Gruß

Dookie
flex
User
Beiträge: 5
Registriert: Montag 1. März 2004, 13:58
Wohnort: Ulm
Kontaktdaten:

Montag 1. März 2004, 16:41

hallo dookie!

ja dachte mir schon, dass das nich so einfach zu verstehen is. habe selber eine zeitlang gebraucht... das is nämlich gar nicht mein code, ich soll nur eine schöne Fehlerbehandlung dazumachen...

Also in a.py steht lediglich dieses Dictionary, sonst macht die gar nix.
Dieses Dictionary wird mit dem execfile-Befehl in test eingelesen, d.h. in test steht dann das was in der a.py steht.
Und das mit dem assert funktioniert wohl so: Ich kann überprüfen, ob die Struktur in test der definierten Struktur von MAPPING entspricht.
Wenn das nicht der Fall wäre, dann bekomme ich bei dem assert einen AssertionError der mir sagt, dass test nicht auf MAPPING passt.

Ich hätte aber gern, dass mir praktisch schon beim einlesen/execfile() gesagt wird, wo der Fehler in a.py steckt. Also müsste man execfile() und assert irgendwie gleichzeitig machen...
verstanden? :? wenn nicht, ich versuchs gern nochmal :)

Gruss
Felix
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Montag 1. März 2004, 18:14

flex hat geschrieben:verstanden? :? wenn nicht, ich versuchs gern nochmal :)
Also wenn ich es richtig verstanden habe, machst du execfile nur, um aus a.py ein Namenloses Dict zu holen? :shock: Boahr... Wenn das keine absolute Vorgabe ist (was ich Schwachsinn fände) würde ich in a.py dem dict einen Namen geben und es importieren.

Aber dass ist hierzu egal, du wirst in beiden Fällen nicht darum kommen, das erst einzulesen und dann zu testen, es sei denn du bastelst eine komplizierte String Analyse (was aber ineffektiv sein würde).

Milan
flex
User
Beiträge: 5
Registriert: Montag 1. März 2004, 13:58
Wohnort: Ulm
Kontaktdaten:

Montag 1. März 2004, 18:36

hi!

danke schonmal für die schnellen Antworten...
das mit dem Dict und den Dateien ist noch etwas umfangreicher, und war eben schon so gegeben.... ist aber auch nicht das Problem, ne!

Problem ist definitiv, dass ich den Fehlerinformationen direkt aus der auszulesenden Datei brauche...

Geht das denn dann nur, wie Milan beschreibt, über komplizierte Umwege? In welche Richtung müsste ich da weiterdenken? Hat wer einen Lösungsansatz dazu? Oder gäbe es andere Möglichkeiten? Ideen?

Danke nochmal und schonmal

Felix
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 1. März 2004, 18:58

jo geht wohl nur über Umwege.

Du kannst nachdem der Fehler aufgetreten ist, die Zeile mit dem Key mittels einfacher Suche in der a.py raussuchen.

Code: Alles auswählen

z_nr = 0
for line in file("a.py",'r'):
    if key in line:
        break
    z_nr += 1
print "Fehler in Zeile %i" % z_nr

Gruß

Dookie
flex
User
Beiträge: 5
Registriert: Montag 1. März 2004, 13:58
Wohnort: Ulm
Kontaktdaten:

Montag 1. März 2004, 22:46

hi!

Aja... das hört sich nicht schlecht an, aber:
Diese einzulesenden Dateien können sehr gross sein und beinhalten verschachtelte Dicts, wo dann schonmal derselbe Key auftauchen kann und dann hab ich wieder ein Problem....

Weitere Ideen?
Danke und Gruss
Felix

PS: zur Anschauung nochmal Auszug aus soner einzulesenden Datei:

Code: Alles auswählen

{'@converter': '/convert_step1.py',
 '@converterhexdigest': '4f348851d11dd7050081f58a42e7b350',
 '@date': 'Wed Feb  4 15:56:26 2004',
 '@source': '/servers/.../2m_31s_327990u.sgs.py',
 '@sourcehexdigest': 'c3a02f8b0f33cec7211742dc8097533b',
 '@stype': "DICT({'@convert .... eq',)\n  }]\n}",
 'children': [{'children': [{'children': [{'collist': [70, 76],
                                           'color': 'yellow',
                                           'maxcol': 76,
                                           'maxrow': 73,
                                           'mincol': 70,
                                           'minrow': 62,
                                           'rowlist': 62,
                                           'tag': 'fragment',
                                           'tags': ('pedestrian',),
                                           'type': 'rect'}],
                             'imagefile': '/servers/.../2003y_12m_04d_15h_32m_21s_358362u.tiff',
                             'tags': ('frame',)},
                            {'children': [{'collist': [71, 75],
                                           'color': 'yellow',
                                           'maxcol': 75,
                                           'maxrow': 73,
                                           'mincol': 71,
                                           'minrow': 62,
                                           'rowlist': [62, 73],
                                           'tag': 'fragment',
                                           'tags': ('pedestrian',),
                                           'type': 'rect'}],
                             'imagefile': '/servers/....03y_12m_04d_15h_32m_21s_398331u.tiff',
                             'tags': ('frame',)},
                            {'children': [{'collist': [71, 75],
                                           'color': 'yellow',
                                           'maxcol': 75,
                                           'maxrow': 72,
                                           'mincol': 71,
                                           'minrow': 62,
                                           'rowlist': [62, 72],
                                           'tag': 'fragment',
                                           'tags': ('pedestrian',),
                                           'type': 'rect'}],
                             'imagefile': '/servers/....
                          .....................
usw...
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Montag 1. März 2004, 23:12

tja, das würde ich dann "broken design" nennen. Sowas macht man eher mittels XML und einem Parser, der dann auch die Fehler behandelt.


Gruß

Dookie
flex
User
Beiträge: 5
Registriert: Montag 1. März 2004, 13:58
Wohnort: Ulm
Kontaktdaten:

Montag 1. März 2004, 23:40

hmmm...
hab das auch nicht verbrochen, aber ich glaub die wussten schon was die da machen... und es hiess: fang doch da mal ordentlich die Fehler ab :cry:

hat keiner mehr Ideen, oder?

Gruss und Gutnacht erstmal
Felix
Antworten