[Python-Dev] Declaring setters with getters

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


Unless I get negative feedback really soon I plan to submit this later
today. I've tweaked the patch slightly to be smarter about replacing
the setter and the deleter together if they are the same object.

On Nov 9, 2007 10:03 PM, Guido van Rossum <guido at python.org> wrote:
> 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/)
>



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


More information about the Python-Dev mailing list