[Python-Dev] The decorator(s) module (original) (raw)

Duncan Booth duncan.booth at suttoncourtenay.org.uk
Sat Feb 11 14:29:07 CET 2006


Georg Brandl <g.brandl at gmx.net> wrote in news:dsj0p7$tk3$1 at sea.gmane.org:

Unfortunately, a @property decorator is impossible...

It all depends what you want (and whether you want the implementation to be portable to other Python implementations). Here's one possible but not exactly portable example:

from inspect import getouterframes, currentframe import unittest

class property(property): @classmethod def get(cls, f): locals = getouterframes(currentframe())[1][0].f_locals prop = locals.get(f.name, property()) return cls(f, prop.fset, prop.fdel, prop.doc)

@classmethod
def set(cls, f):
    locals = getouterframes(currentframe())[1][0].f_locals
    prop = locals.get(f.__name__, property())
    return cls(prop.fget, f, prop.fdel, prop.__doc__)

@classmethod
def delete(cls, f):
    locals = getouterframes(currentframe())[1][0].f_locals
    prop = locals.get(f.__name__, property())
    return cls(prop.fget, prop.fset, f, prop.__doc__)

class PropTests(unittest.TestCase): def test_setgetdel(self): class C(object): def init(self, colour): self._colour = colour

        @property.set
        def colour(self, value):
            self._colour = value

        @property.get
        def colour(self):
            return self._colour

        @property.delete
        def colour(self):
            self._colour = 'none'
            
    inst = C('red')
    self.assertEquals(inst.colour, 'red')
    inst.colour = 'green'
    self.assertEquals(inst._colour, 'green')
    del inst.colour
    self.assertEquals(inst._colour, 'none')

if name=='main': unittest.main()



More information about the Python-Dev mailing list