[Tutor] object attribute validation
neubyr
neubyr at gmail.com
Sun Feb 24 22:35:52 CET 2013
On Fri, Feb 22, 2013 at 10:31 PM, Steven D'Aprano <steve at pearwood.info>wrote:
> 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
>
>
Thank you for your comments Steven.
Yes, I think I should remove property deleter in this case.
I would like to use this Person class in another class. For example, if
Person class is 'model' in a small MVC-style web application, then where
should I place my validation. A view form will be passing parameters to a
controller which will create and write Person objects/models. Should the
validation be in place at all three levels?
I am inclined towards adding integer validation in views, but I am not sure
where should I add it in a controller class. Also, it's easy to add integer
validation in view form (javascript), but what if I have a more complex
format - X509 certificate or some other file-type related validation? Is
it OK to validate them only in property setter methods?
-- N
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20130224/0f7bc6d7/attachment-0001.html>
More information about the Tutor
mailing list