[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