471,348 Members | 1,189 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 471,348 software developers and data experts.

recursion error using setattr and getattr

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
Jun 7 '07 #1
0 1070

This discussion thread is closed

Replies have been disabled for this discussion.

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.