Automatische Validierung von Attributen eines Objektes
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. So funktionierts: aMember = Member("Hugo") aMember.name = "Gabi" # assign a valid attribute aMember.name = "hu@go" # kaboom -> assertion fires, only alpanumerics allowed Der Code: class HasAssertedAttributes: def __init__(self, aValue): self.aValue = aValue def __setattr__(self, aName, aValue): if self.__dict__.has_key(aName): if isinstance( self.__dict__[aName], AssertedAttribute): self.__dict__[aName].aValue = aValue else: self.__dict__[aName] = aValue else: self.__dict__[aName] = aValue class AssertedAttribute: def __init__(self, aValue): self.aValue = aValue def __setattr__(self, aName, aValue): self.assertValue(aValue) self.__dict__[aName] = aValue def __repr__(self): return self.aValue def assertValue(self, aValue): raise UserWarning, "this methode must be implemented by child" class AssertedName(AssertedAttribute): def assertValue(self, aValue): assert len(aValue) < 50 assert aValue.isalpha() class Member(HasAssertedAttributes): def __init__(self, name ): self.name = AssertedName(name) Bin gespannt ob jemand eine Idee hat wie man das besser machen kann. Viele Gruesse, Juergen _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
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 _______________________________________________ python-de maillist - python-de@python.net http://python.net/mailman/listinfo/python-de
participants (2)
-
Diez B. Roggisch -
Rauch, Juergen (Juergen)