[Python-de] Alptraum Unicode
Stefan Schwarzer
sschwarzer at sschwarzer.net
Sam Dez 27 17:21:41 CET 2003
Hi Olaf,
On Sat, 2003-12-27 13:08:12 +0100, Olaf 'Ruebezahl' Radicke wrote:
> Am Samstag 27 Dezember 2003 02:56 schrieb Uwe Schmitt:
> > > die Codierung gerade eindeutig ist oder nicht. Das Leben mit Python
> > >
> > > > währe um einiges einfacher, wenn ein Unicode-String eine Klasse
> > > > (bzw. Typ) währe.
> >
> > aber unicode-strings sind doch ein typ/klasse in python...
dem stimme ich zu :)
> xml-string = ""
> #was habe ich jetzt UNICODE oder ASCII ?
>>> type('')
<type 'str'>
>>> type(u'')
<type 'unicode'>
> xml_string = socket_objekt.empfangen()
> #was habe ich jetzt UNICODE oder ASCII ?
>
> sql_query = patser_objekt.run(xml_string)
> #was habe ich jetzt UNICODE oder ASCII ?
>
> antwort = psql_objekt.query(sql_query)
> #was habe ich jetzt UNICODE oder ASCII ?
>
> interaktions_string = Tkinter_gui_dialog.run(antwort)
> #was habe ich jetzt UNICODE oder ASCII ?
Das kommt auf die API der verwendeten Methoden an!
> Am Samstag 27 Dezember 2003 00:40 schrieb Stefan Schwarzer:
> > Sollte das blauäugig klingen, liegt es einfach daran, dass ich zu
> > wenig über dein Programm weiß. ;-) Nach deiner Beschreibung vermute
> > ich jedenfalls eher ein Design-Problem, und nicht so sehr, dass der
> > Umgang mit Unicode in Python notwendigerweise ekelhaft sein muss.
>
> Volgende Funktion hat ein UNICODE-Fehler produzirt:
>
> def _projekt_report(eltern_objekt, \
> project_title, \
> rekursiv, \
> mit_stammdaten_von, \
> epoch_begin, \
> epoch_end, \
> ausgabeformat):
> [ca. 150 Codezeilen gelöscht]
Deine Funktion tut m. E. viel zu viel:
- aufbauen von LaTeX-Code
- Datenbankzugriffe
- Zeichenkonvertierung
- diverse Fallunterscheidungen ("Fachlogik")
Ich glaube, unter diesen Bedingungen würde ich jede Menge Fehler
machen. Bei solchem Code verliert man den Überblick, und sogar Python
macht dann keinen Spaß mehr.
Vorschlag: Redesign.
Unter Vorbehalt (da ich deinen Code nicht gründlich gelesen habe),
schlage ich folgendes vor:
- Eine Klasse besorgt die Daten, die zur Fallunterscheidung und zum
Aufbau der LaTeX-Datei notwendig sind. Alle zu lesenden
Attribute/Methoden dieser Klasse geben Strings als Unicode-Objekte
zurück.
- Eine andere Klasse kümmert sich um die Erzeugung von LaTeX-Dateien,
alle Eingaben sind Unicode-Strings. Diese Klasse sollte nichts von
deinem konkreten Problem wissen, also z. B. nur Methoden wie
emph(unicode_object) oder begin_environment(unicode_object)
enthalten. Möglicherweise kannst du so eine Klasse sogar aus einem
anderen Projekt auftreiben und ggf. anpassen (falls deren Lizenz das
zulässt).
- Schreibe deine Funktion unter Verwendung der beiden genannten
Klassen. Diese Funktion enthält damit keine Datenbank-Zugriffe
(nur indirekte, über die erste der beiden obigen Klasse) und
schreibt auch keine LaTeX-Befehle in einer Datei. Darum kümmert sich
wiederum die zweite der beiden oben genannten Klassen.
- Sollte es immer noch zu unübersichtlich sein, kannst du neue Klassen
für Zeitarithmetik (gibt es schon massenhaft, z. B. das
datetime-Modul in Python 2.3 oder mxDateTime) und/oder für Personen
und/oder Checklisten einführen.
Die obige Aufzählung sehe ich nicht unbedingt als unumstößliche
Empfehlung, wie das Problem zu gliedern ist, sondern mehr als Anregung
für eigene Ideen. (Du kennst das Problem, das du lösen willst,
schließlich besser als ich.)
Wenn objektorientiertes Design neu für dich ist, schau dir mal diesen
URL an: http://c2.com/doc/oopsla89/paper.html . An deutschen Seiten
habe ich http://www.dfpug.de/konf/konf_1995/oop/SessionD-OOAD.htm und
http://www.google.de/search?q=cache:XelWpWFyahAJ:portal.dfpug.de/dFPUG/Dokumente/Konferenzen/VFP-Konferenz%25201998/D-CRC.doc+crc+card+object+-cyclic+-book&hl=de&lr=lang_de&ie=UTF-8
gefunden. Vielleicht gibt es auch hier etwas für dich:
http://directory.google.de/Top/World/Deutsch/Computer/Programmieren/Methoden/Objektorientiert/
Wichtig ist nicht nur, das Problem aufzuteilen, sondern auch, damit
aufzuhören. ;-) Du brauchst nur soweit aufzugliedern, dass du das
Problem lösen kannst, ohne allzuviele Abhängigkeiten gleichzeitig im
Kopf zu behalten. Falls auch andere Menschen den Code lesen und/oder
ändern müssen, musst du deren Kapazität, deinen Code zu überblicken,
berücksichtigen. Es kann also sein, dass du es noch einfacher machen
musst, als du es allein für dich brauchen würdest.
Viel Erfolg! :-)
Viele Grüße
Stefan