reuse validation logic with descriptors

Steve Holden steve at
Tue Mar 1 23:08:12 CET 2005

David S. wrote:
> Steven Bethard <steven.bethard <at>> writes:
>>David S. wrote:
>>>I am looking for a way to implement the same simple validation on many 
>>>instance attributes and I thought descriptors
>>>( looked like the 
>>>right tool.  
>>Looks like you're trying to reinvent the property descriptor.  Try using 
>>the builtin property instead:
>>py> def getchar(self):
>>...     if not hasattr(self, '_char'):
>>...         self._char = None
>>...     return self._char
>>py> def setchar(self, value):
>>...     if not len(value) == 1:
>>...         raise ValueError
>>...     self._char = value
>>py> singlechar = property(getchar, setchar)
>>py> class Flags(object):
>>...     a = singlechar
>>...     b = singlechar
>>py> f = Flags()
>>py> f.a = "a"
>>py> f.b = "bb"
>>Traceback (most recent call last):
>>   File "<interactive input>", line 1, in ?
>>   File "<interactive input>", line 3, in setchar
> This still fails to work for instances variables of the class.  That is 
> if I use your property in the following:
> py> ...class Flags(object):
> ...        def __init__(self): 
> ...             a = singlechar
> ...
> py> f = Flags()
> py> f.a = "a"
> Now f.a.__class__.__name__ returns 'str'.  So the property was not 
> used at all.
You want assignment to a method-local variable to turn an attribute into 
a property? That's programming with a magic wand ...

> Also, it seems that using a property, I can not do the other useful 
> things I can do with a proper class, like provide an __init__, __str__, 
> or __repr__.  
That will depend on the value returned by property access, surely?

I suspect you are a little confused about properties and descriptors.

Meet the Python developers and your favorites March 23-25
Come to PyCon DC 2005            
Steve Holden                 

More information about the Python-list mailing list