PEP 318: Is chaining decorators even possible?

Michele Simionato mis6 at pitt.edu
Thu Jun 12 19:54:59 CEST 2003


Kevin Smith <Kevin.Smith at sas.com> wrote in message news:<20030612080349419-0400 at braeburn.themorgue.org>...
> It has been brought up a couple of times in other threads that simply 
> chaining descriptors won't work (i.e. classmethod(synchronized(foo))).  
> Another possibility was to use subclassing (i.e. type('newtype',(
> classmethod,synchronized,{})(foo)).  When I wrote PEP 318, I wasn't sure 
> myself if it was possible to chain them, but I figured someone would 
> point it out if it wasn't.  So my question is, is it even possible to 
> chain decorators in a general way? 

Here is a bare bone implementation (i.e. written in 5 minutes and probably
buggy) to show how it would work the multiple inheritance way:


class chatty(object):
    "custom decorator, printing a message when the attribute is accessed"
    def __get__(self,obj,cls):
        print "Accessing %s" % self
        return super(chatty,self).__get__(obj,cls)

class chattyclassmethod(chatty,classmethod): pass

class C(object):
    # would be def ccm(cls)[chatty,classmethod]:		
    def ccm(cls):
        return 'This is a chattyclassmethod of %s' % cls
    ccm=chattyclassmethod(ccm)
    
c=C()
print C.ccm()
print c.ccm()

with output:

Accessing <__main__.chattyclassmethod object at 0x403143ec>
This is a chattyclassmethod of <class '__main__.C'>
Accessing <__main__.chattyclassmethod object at 0x403143ec>
This is a chattyclassmethod of <class '__main__.C'>

Notice that currently classmethod is not cooperative, therefore it
would not work in the other order:

class classmethodchatty(classmethod,chatty): pass

class C(object):
    def cmc(cls):
        return 'This is a classmethodchatty of %s' % cls
    cmc=classmethodchatty(cmc)

c=C()
print C.cmc()
print c.cmc()
This is a chattyclassmethod of <class '__main__.C'>
This is a chattyclassmethod of <class '__main__.C'>

This is why I said classmethod and staticmethods should be reimplemented
(even more so if you want to use Steven's solution).

HTH,

                                     Michele




More information about the Python-list mailing list