[Python-Dev] Declaring setters with getters

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


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/)


More information about the Python-Dev mailing list