[Python-de] Automatische Validierung von Attributen eines Objektes

Diez B. Roggisch deets at web.de
Don Okt 20 13:37:22 CEST 2005


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
-------------- nلchster Teil --------------
Ein Dateianhang mit Bin?rdaten wurde abgetrennt...
Dateiname   : validator.py
Dateityp    : application/x-python
Dateigr??e  : 3233 bytes
Beschreibung: nicht verf?gbar
URL         : http://starship.python.net/pipermail/python-de/attachments/20051020/3a640d1a/validator.bin