[Python-de] Automatische Validierung von Attributen eines Objektes

Rauch, Juergen (Juergen) juergen.rauch at optimay.com
Fre Okt 21 14:34:56 CEST 2005


Diez,

erstmal danke fuer deine Idee, da waere ich nicht so schnell
draufgekommen.
Zugegeben, ich hab's noch nicht ganz verdaut. :)
Ich werde es die Tage genauer studieren. 
Wenn ich klarer sehe dann melde ich mich wieder.

Wie auch immer man das dann implementiert so ein generischer
Validierungs-Mechanismus 
ist doch in vielen Faellen sehr nuetzlich.

Juergen



-----Original Message-----
From: python-de-bounces at python.net [mailto:python-de-bounces at python.net]
On Behalf Of Diez B. Roggisch
Sent: 20 October 2005 13:37
To: python-de at python.net
Subject: Re: [Python-de] Automatische Validierung von Attributen eines
Objektes


Am Mittwoch, 19. Oktober 2005 13:58 schrieb Rauch, Juergen (Juergen):
> Liebe Gemeinde,
>
> folgende Idee moechte ich hier zur Diskussion stellen um sie danach
> evtl. im Python Cookbook zu publizieren.
>
> Die Aufgabe:
>     Es soll sichergestellt werden, dass einem Objekt keine unsinnigen
> Attribute zugewiesen werden koennen.
>
> Hintergrund:
>     Zum Beispiel eine WEB Applikation die CGI-Parameter bekommt und
> diese dann Attributen zuweist.
>     Es geht also um eine serverseitige Validierung von Eingabewerten -
> Ja, ich weiss, Eigabewerte kann man auch
>     vom Client validieren lassen, aber darum geht es jetzt nicht.


<snip>

> Bin gespannt ob jemand eine Idee hat wie man das besser machen kann.

Ja. Metaclassen. Geht wesentlich einfacher. 

Folgende annahme: ein Validator ist ein callable, das einfach den Wert
bekommt 
und dann einen ValueError schmeisst wenn der zu setzende String _nicht_ 
passt. Ausserdem werden Leerstrings und None auf None abgebildet.

Eine moegliche Erweiterung sieht so aus, das man statt eines validators
ein 
Tupel aus coercer und validator setzt. Erstere wird dazu verwendet den
Wert 
wirklich zu _setzen_, zweiterer zu validieren. Der Vorteil: Ich kann zB
einen 
String auf int-konformitaet pruefen, den ich aber trotzdem als String
setzen 
will.

Und richtig spannend wird's, wenn man einen validator-wrapper schreibt,
der 
die __and__ und __or__ Methoden ueberlaed, um compositionen von
Validatoren 
moeglich zu machen. Dann hat man eigentlich so ziemlich alles, was mir
so 
einfaellt was man brauchen koennte :)


Angehangen mein kleiner Test. Kleiner Schoenheitsfehler: Durch die
Verwendung 
von int und float hat man Probleme sowas wie "" oder None zu
unterdruecken 
mittels eines speziellen not-null-validators. Dazu muesste man die 
Validator-Semantik so aendern, das sie "" und None akezeptieren.

MFG Diez
Diez