On Fri, Apr 4, 2008 at 2:49 AM, Zaur Shibzoukhov <[EMAIL PROTECTED]> wrote:
> I suggest a context manager for property defining/redefining. There is a > prototype and illustrative example: > > > > -------------------------------------------------------------------------------------------------------------- > import sys > > null = object() > _property = property > class property(_property): > # > def __init__(self, *args, **kw): > _property.__init__(self, *args, **kw) > self.__enter__ = self.__enter > self.__exit__ = self.__exit > # > @classmethod > def __enter__(self): > return null > # > @classmethod > def __exit__(self, type, value, tb): > if tb is None: > frame = sys._getframe(1) > self.__exitHandler(self, frame.f_locals) > # > def __enter(self): > return null > # > def __exit(self, type, value, tb): > if tb is None: > frame = sys._getframe(1) > self.__exitHandler(self, frame.f_locals) > # > @staticmethod > def __exitHandler(self, _locals): > propName = "_" > PropName = str(id(self)) > for key, value in _locals.items(): > if value is null: > propName = key > PropName = key.capitalize() > break > > if type(self) == type(property): > getFunc = _locals.pop('get', None) > setFunc = _locals.pop('set', None) > delFunc = _locals.pop('delete', None) > doc = _locals.pop('doc', None) > else: > getFunc = _locals.pop('get', None) or self.fget > setFunc = _locals.pop('set', None) or self.fset > delFunc = _locals.pop('delete', None) or self.fdel > doc = _locals.pop('doc', None) or self.__doc__ > > if getFunc: > funcName = "_get"+PropName > getFunc.__name__ = funcName > _locals[funcName] = getFunc > if setFunc: > funcName = "_set"+PropName > setFunc.__name__ = funcName > _locals[funcName] = setFunc > if delFunc: > funcName = "_del"+PropName > delFunc.__name__ = funcName > _locals[funcName] = delFunc > > prop = property(getFunc, setFunc, delFunc) > prop.__doc__ = doc > _locals[propName] = prop > > > ----------------------------------------------------------------------------------------------------------- > > def testPropertyMaker(): > class AAA: > _v = 1 > with property as v: > doc = "Example of making property with *with* statement" > def get(self): > return self._v > def set(self, v): > self._v = v > > class BBB(AAA): > with AAA.v as v: > doc = "Example of modified property" > def get(self): > return [self._v] > > a=AAA() > a.v = 10 > print(a.v) > print(AAA.v.__doc__) > > b=BBB() > b.v = 100 > print(b.v) > print(BBB.v.__doc__) > > This code is also in attachment. > > Is it suitable for contextlib.py? I don't really see how this is better/easier than: class AAA: def get_x(): pass def set_x(): pass x = property(get_x, set_x, None, "The x property") > > > > _______________________________________________ > Python-3000 mailing list > Python-3000@python.org > http://mail.python.org/mailman/listinfo/python-3000 > Unsubscribe: > http://mail.python.org/mailman/options/python-3000/musiccomposition%40gmail.com > > -- Cheers, Benjamin Peterson
_______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com