PEP: Adding decorators for everything

Diez B. Roggisch deets at nospam.web.de
Tue Oct 18 13:16:00 EDT 2005


> @GuardedClass
> class Foo:

The functionality can be done using a meta-class, in a similarily 
declarative way.

>     @Transient
>     a = 'a transient field, ignored when serializing'
> 
>     @Const
>     PI = 22.0 / 7
> 
>     @TypeSafe(int)
>     count = 10

These are tricky, as the implicitly change the nature of the values - 
they become properties. And the decorator protocol has to change, as the 
passed value is obviously not a callable, but a random value. So in the 
end, you could simply do something like this:


@Const(3.24)
def PI(self):
    pass

with Const basically ignoring its callable-argument and simply returning 
a get-only-property. I have to admit that I was tempted to use such a 
thingy just the other day. But it is not exactly nice, and using

PI = Const(3.14) as you suggested is even more pleasing.

Additionally, the first @Transient-decorator can't be done that way, as 
the decorator protocol doesn't know about the _name_ a thing is bound to 
later. And you'd need that to actually set up e.g. __getstate__ operate 
properly.

And it doesn't mkae much sense anyway, as "a" is a class variable, not a 
instance variable.

So - I'm not very much in favour of these enhancements.


> It would also be better if multiple decorators could be written on the
> same line. E.g.:
> @A @B(x, y) @C
> def foo(): ...

That one I like.

Diez



More information about the Python-list mailing list