recursion error using setattr and getattr

Nathan Harmston ratchetgrid at googlemail.com
Thu Jun 7 13:23:48 CEST 2007


Hi,

I m trying to implement an object which contains lazy" variables. My
idea is to alter the getattr and the setattr methods. However I keep
on getting a recursion error.

My idea is that the lazy variable can be stored in a variety of
places, Database, PyTables etc. The lazy variable is a large variable
and so I dont want to hold it in memory all of the time, I d rather
just get it when needed and then store it for future work. Most of the
work will be done using var1 and var2

So ......

class LazyBase(object):
	self.var1 = 0
        self.var2 = None
	def __init__(self, name):
		self.name = name
	def __str__(self):
		return self.name
	def __setattr__(self, attr, k):
		if attr == "var1":		
			if self.var1 != k
				self.var1 = k
				if self.lazy != None
					self.lazy = None
		elif attr == "var2"		:
			if self.var2 != k
				self.var2 = k
				if self.lazy != None
					self.lazy = None
		else:
			raise Exception("Attribute")


class SQLLazy(LazyBase):	
	def __init__(self, name, table="test_table"):
		self.table = table
		LazyBase.__init__(name)
		self.lazy = None
	def __getattr__(self, attr):
		if attr == "lazy":
			if self.lazy == None: # problem line I think
				print "Hit Database"
				# use sqlalchemy to get the variable
				# set self.lazy = lazy
				return self.lazy
			else:
				return self.lazy
		else:
			try:
				return Lazy.__getattr__(attr)
			except:
				raise Exception("Attribute Exception")
	def __setattr__(self, attr, k):
		if attr == "lazy"
			raise Exception("Cannot alter lazy")
		else:
			try:
				Lazy.__setattr__(attr, k)
			except:
				raise Exception("Attribute Exception")

if __name__=='__main__':
	spam = SQLLazy("Test")
	spam.var2 = 10
	print spam.lazy
	print spam.lazy
	spam.var2 = 5
        print spam.lazy

I m expecting the output:
	Hit Database
	Lazy Variable
	Lazy Variable
	Hit Database
	Lazy Variable	

However I just get recursion errors. Does anyone have any ideas how I
can implement this sort of thing through my current method, or is
there a better way to accomplish this.

THanks

Nathan



More information about the Python-list mailing list