Jim Fulton wrote: > A common use of read descriptors is for lazily computed data: > > class readproperty(object): > "Create a read descriptor from a function" > > def __init__(self, func): > self.func = func > > def __get__(self, inst, class_): > if inst is None: > return self > > return self.func(inst) > > class Spam: > > @readproperty > def eggs(self): > ... expensive computation of eggs > > self.eggs = result > return result
I've also needed behavior like this a few times, but I use a variant of Scott David Daniel's recipe[1]: class _LazyAttribute(object): def __init__(self, calculate_function): self._calculate = calculate_function def __get__(self, obj, _=None): if obj is None: return self try: value = self._calculate(obj) except AttributeError, e: # I don't like this, but if _calculate raises an # AttributeError and I don't catch it, the descriptor # machinery hides it and I can't debug my code raise Exception(e) setattr(obj, self._calculate.func_name, value) return value It uses the .func_name attribute to put the "self.eggs = result" into the property. I like that I don't have to do the set at the end of every function, and I'm never doing anything complicated enough that I don't want the attribute named the same as the function that I passed in. [1] http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/363602 STeVe -- You can wordify anything if you just verb it. --- Bucky Katt, Get Fuzzy _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com