[Tutor] object attribute validation

Steven D'Aprano steve at pearwood.info
Sat Feb 23 05:31:49 CET 2013


On 23/02/13 10:50, neubyr wrote:
> I would like to validate data attributes before the object is instantiated
> or any changes thereafter. For example, following is a simple Person class
> with name and age attributes. I would like to validate whether age is an
> integer before it is added/changed in the object's dictionary. I have taken
> a simple integer validation example, but it could be something like
> DateField validation or X509 certificate validation as well. Following is
> my example code:
>
>
> class Person(object):
>    def __init__(self,name,age):
>      self.name = name
>      self.age = age
>
>    def get_age(self):
>      return self._age
>
>    def set_age(self,val):
>      try:
>        int(val)
>        self._age = val
>      except ValueError:
>          raise Exception('Invalid value for age')

The setter is unnecessarily complicated. Just let the ValueError, or TypeError, or any other error, propagate:

     def set_age(self,val):
         self._age = int(val)


This will allow the user to pass ages as strings, which I assume you want because that's what your code above does. instance.age = "6" will set the age to the int 6. If all you want to accept are ints, and nothing else:


     def set_age(self,val):
         if isinstance(val, int):
             self._age = val
         else:
             raise TypeError('expected an int, but got %r' % val)



>    def del_age(self):
>      del self._age
>
>    age = property(get_age,set_age,del_age)


In general, you would leave out the property deleter. I find that in general if you're validating attributes, you want them to be present and valid, so deleting should be an error.


-- 
Steven


More information about the Tutor mailing list