[Python-de] Dateien ueber Sockets uebertragen

Hartmut Goebel h.goebel at crazy-compilers.com
Mon Apr 5 20:51:33 CEST 2004


Alexander 'boesi' Bösecke schrieb:

>>* Was ist das maximale Beispiel, bei dem der Fehler nicht auftritt?
> 
> Remote trat der Fehler immer auf. Lokal gar nicht. Bzw ich weiss nicht,
> was du mit maximales Beispiel meinst.

Ein "maximales Beispiel, bei dem der Fehler auftritt" ist das Beispiel, 
das gerade so komplex ist, dass der Fehler noch nicht auftritt. Die Idee 
dahinter ist, den Fehler von "oben" und "unten" einzugrenzen: Man 
iteriert sich quasi an den Fehler heran. Klar?

>>* Welche Zeile(n) unterscheiden das Beispiel, bei dem der Fehler
>>   auftritt, von einem Beispiel, bei dem der Fehler nicht mehr auftritt?
> 
> Ein time.sleep(0.2) nach dem ersten send brachte Abhilfe, das war aber
> natuerlich keine Loesung

Damit hast Du vielleicht einen word-around gefunden, aber das Problem 
nicht gelöst. Oder konntest Du danahc sagen: "Aha, daran war es gelegen"?

(Ich überlege mich eben, ob ich eine Vorlesung: Fehlersuche in 
Programmen anbieten soll ;-)


> Allerdings scheint mir (c)Pickle wirklich nicht das geeignete Mittel um
> einfache Datentypen wie Integer, Listen und Tupel zu uebertragen. Oder
> spricht irgendwas gegen die Verwendungen von repr/eval?

Ja: eval ist typischerweise ein Zeichen von schlechtem Code, da es sich 
in den meisten Fällen vermeiden läßt. Für den Lösungsweg, den Du unten 
gegangen bist, wäre es aber okay -- ich würde nur gleich einen anderen 
Lösungsweg gehen ;-)

Allerdings machst Du unten -- nach meinem Geschmack -- viel zu viel per 
Hand. Ich würde dann noch eher eine Mischung aus Deinem vorherigen 
Ansatz machen: Daten Pickeln und deren Länge vornewegschicken. Was Du 
dazu brauchst, hast Du unten schon stehen, kannst aber 80% wieder 
rausnehmen, weil das Pickle für dich übernimmt.

> Ich habs jetzt folgender Klasse geloest:

Hmmmm, zum Lernen okay, für produktiven Einsatz hat es einen Haken: Es 
löst ein Problem, für das es schon andere Lösungen gibt.

>         if FIL == 1:
>             typ = 'FIL'
>         else:
>             if   type(data) == int:   typ = 'INT'
>             elif type(data) == long:  typ = 'LNG'
>             elif type(data) == str:   typ = 'STR'
>             elif type(data) == list:  typ = 'LST'
>             elif type(data) == tuple: typ = 'TPL'
>             else: typ = 'OTH'
>             data = repr(data)
>         if FIL == 0: data = repr(data)

Das kannst Du auch Pickle machen lassen, denn Pickle arbeitet auch nicht 
anders.

>         while length == 0:
               ...
>         while typ == '':
               ...

Wenn Du Header und Daten mit einem anderen Zeichen trenntst, als die 
Header-Felder untereinander, dann brauchst Du nur eine Schleife:

      while not '\n' in self.getData:
         ...

(kann man noch optimieren).

-- 
Regards
Hartmut Goebel

| Hartmut Goebel               | We build the crazy compilers |
| h.goebel at crazy-compilers.com | Compiler Manufacturer        |