[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 |