[Python-Dev] RFC: readproperty (original) (raw)
Steven Bethard steven.bethard at gmail.com
Wed Sep 28 18:04:42 CEST 2005
- Previous message: [Python-Dev] RFC: readproperty
- Next message: [Python-Dev] RFC: readproperty
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
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
- Previous message: [Python-Dev] RFC: readproperty
- Next message: [Python-Dev] RFC: readproperty
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]