[Python-ideas] Assignment decorators (Re: The Descriptor Protocol...)
Guido van Rossum
guido at python.org
Fri Mar 4 07:03:05 CET 2011
On Thu, Mar 3, 2011 at 9:11 PM, Greg Ewing <greg.ewing at canterbury.ac.nz> wrote:
> def overridable_property(name, doc = None):
> """Creates a property which calls methods get_xxx and set_xxx of
> the underlying object to get and set the property value, so that
> the property's behaviour may be easily overridden by subclasses."""
>
> getter_name = intern('get_' + name)
> setter_name = intern('set_' + name)
> return property(
> lambda self: getattr(self, getter_name)(),
> lambda self, value: getattr(self, setter_name)(value),
> None,
> doc)
>
> It needs to know the name of the property so that it can build
> the correct method names. That's an implementation detail that
> the user shouldn't have to care about, but I'm forced to expose
> it because of a deficiency in the language. It's like a house
> with pieces of plumbing sticking out of the walls instead of
> being hidden away. It works, but it's ugly and annoys you every
> time you look at it.
I agree it's not a good use case for a metaclass. I still don't think
it's worth adding decorated assignment for; the annoyance is pretty
minor and there are surely many other language warts that one might
like to smooth over (but not with decorators).
I don't even think it's a great use case for a decorated assignment; I
don't think that
@overridable_property
foo = "Whatever"
looks particularly elegant. Especially if you had a bunch of these in
a row, I think I'd prefer the one-liner-with-string-literal over the
two-liner-with-decorator. Though I don't know if these frequently
occur in bunches. (The field/property definitions in Django and App
Engine definitely do.)
--
--Guido van Rossum (python.org/~guido)
More information about the Python-ideas
mailing list