[Python-Dev] Declaring setters with getters

Guido van Rossum guido at python.org
Sat Nov 10 07:03:03 CET 2007


D'oh. I forgot to point to the patch. It's here:
http://bugs.python.org/issue1416

On Nov 9, 2007 10:00 PM, Guido van Rossum <guido at python.org> wrote:
> To follow up, I now have a patch. It's pretty straightforward.
>
> This implements the kind of syntax that I believe won over most folks
> in the end:
>
>   @property
>   def foo(self): ...
>
>   @foo.setter
>   def foo(self, value=None): ...
>
> There are also .getter and .deleter descriptors.  This includes the hack
> that if you specify a setter but no deleter, the setter is called
> without a value argument when attempting to delete something.  If the
> setter isn't ready for this, a TypeError will be raised, pretty much
> just as if no deleter was provided (just with a somewhat worse error
> message :-).
>
> I intend to check this into 2.6 and 3.0 unless there is a huge cry of
> dismay.  Docs will be left to volunteers as always.
>
> --Guido
>
>
> On Oct 31, 2007 9:08 AM, Guido van Rossum <guido at python.org> wrote:
> > I've come up with a relatively unobtrusive pattern for defining
> > setters. Given the following definition:
> >
> > def propset(prop):
> >     assert isinstance(prop, property)
> >     def helper(func):
> >         return property(prop.__get__, func, func, prop.__doc__)
> >     return helper
> >
> > we can declare getters and setters as follows:
> >
> > class C(object):
> >
> >     _encoding = None
> >
> >     @property
> >     def encoding(self):
> >         return self._encoding
> >
> >     @propset(encoding)
> >     def encoding(self, value=None):
> >         if value is not None:
> >             unicode("0", value)  # Test it
> >         self._encoding = value
> >
> > c = C()
> > print(c.encoding)
> > c.encoding = "ascii"
> > print(c.encoding)
> > try:
> >     c.encoding = "invalid"  # Fails
> > except:
> >     pass
> > print(c.encoding)
> >
> > I'd like to make this a standard built-in, in the hope the debate on
> > how to declare settable properties.
> >
> > I'd also like to change property so that the doc string defaults to
> > the doc string of the getter.
> >
> > --
> > --Guido van Rossum (home page: http://www.python.org/~guido/)
> >
>
>
>
> --
> --Guido van Rossum (home page: http://www.python.org/~guido/)
>



-- 
--Guido van Rossum (home page: http://www.python.org/~guido/)


More information about the Python-Dev mailing list