[Python-Dev] method decorators (PEP 318)
Jack Diederich
jack at performancedrivers.com
Mon Mar 29 16:40:27 EST 2004
On Mon, Mar 29, 2004 at 01:47:13PM -0700, Shane Holloway (IEEE) wrote:
> grr... spacing didn't quite come out right. Blasted tabs. Let's try
> this again:
>
> class Example(object):
> def foo(self, *args) [
> synchronized(lock),
> attributes(author='SWH', protocol=IMyProtocol),
> myArgumentWireMarshaller,
> ]:
> pass # Code goes here
> def bar(self, *args) [
> synchronized(lock),
> attributes(author='SWH', protocol=IMyProtocol),
> myArgumentWireMarshaller,
> ]:
> pass # Code goes here
> def baz(self, *args) [
> synchronized(lock),
> attributes(author='SWH', protocol=IMyProtocol),
> myArgumentWireMarshaller,
> ]:
> pass # Code goes here
>
> more like:
>
> class Example(object):
> IMyProtocolMethod = [
> synchronized(lock),
> attributes(author='SWH', protocol=IMyProtocol),
> myArgumentWireMarshaller,
> ]
>
> def foo(self, *args) [methodreturns(float)] + IMyProtocolMethod:
> pass # Code goes here
> def bar(self, *args) [methodreturns(str)] + IMyProtocolMethod:
> pass # Code goes here
> def baz(self, *args) [methodreturns(int)] + IMyProtocolMethod:
> pass # Code goes here
>
write IMyProtocolMethod as a decorator instead of a list of decorators:
def IMyProtocol(func):
for (decor) in [synchronized(lock),
attributes(author='SWH', protocol=IMyProtocol),
myArgumentWireMarshaller,
]:
func = decor(func)
return func
class Example(object):
def foo(self, *args) [methodreturns(float), IMyProtocol]: pass
def bar(self, *args) [methodreturns(str), IMyProtocol]: pass
def baz(self, *args) [methodreturns(int), IMyProtocol]: pass
if you do that a lot, write a helper function
def make_decorator_chain(*decors):
def anon_decorator(func):
for (decor) in decors:
func = decor(func)
return func
return anon_decorator
IMyProtocol = make_decorator_chain(synchronized(lock),
attributes(author='SWH', protocol=IMyProtocol),
myArgumentWireMarshaller)
-jackdied
More information about the Python-Dev
mailing list