[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