[Python-de] Automatische Validierung von Attributen eines Objektes
Rauch, Juergen (Juergen)
juergen.rauch at optimay.com
Mit Okt 19 13:58:27 CEST 2005
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 at 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