[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