It's not exactly clear what you're trying to tell us here. Basically, what I
guess you want is:
getattr(object,"varname")
This retrieves the value that is bound to varname at "namespace" object. You
cannot retrieve a variable per se in Python, as a variable is just a name
that is a binding to an object.
The second part of what you're trying to do sounds more like stacking
objects. I'll just give it a shot and implement a little bit to test on.
You'll have to extend it to suit your needs... ;-)
class xmlnode(object):
def __init__(self):
self.__subnodes = {}
self.__value = ""
def __getattr__(self,item):
if item == "value":
return self.__value
elif item.startswith("_"):
raise AttributeError, item
elif item not in self.__subnodes:
self.__subnodes[item] = xmlnode()
return self.__subnodes[item]
def __setattr__(self,item,value):
if item.startswith("_"):
super(xmlnode,self).__setattr__(item,value)
elif item == "value":
assert isinstance(value,(str,unicode))
self.__value = value
else:
assert isinstance(value,(str,unicode))
if item not in self.__subnodes:
self.__subnodes[item] = xmlnode()
self.__subnodes[item].value = value
def __delattr__(self,item):
if item.startswith("_"):
super(xmlnode,self).__delattr__(item)
elif item == "value":
self.__value = None
else:
try:
del self.__subnodes[item]
except KeyError:
raise AttributeError, item
def toXML(self,name):
rv = ["<%s>" % name]
for sname, sitem in self.__subnodes.iteritems():
rv.append(sitem.toXML(sname))
if self.__value is not None:
rv.append(self.__value)
rv.append("</%s>" % name)
return "".join(rv)
This implements a simple XML-tree builder with a very specific output format
(tags contain only one string value, which always comes after any subtag
that they might contain, and subtag order is random). The "tricky" part is
in the __*attr__ logic to get subnodes.
Example of usage:
a = test.xmlnode()
a
<test.xmlnode object at 0x2aaaaab57890>
a.value = "test"
a.toXML("root")
'<root>test</root>'
a.book = "welcome"
a.anotherbook = "bye"
a.toXML("root")
'<root><anotherbook>bye</anotherbook><book>welcome</book>test</root>'
a.book.value
'welcome'
a.book.anotherbook.somethingelse.thisislong = "test"
a.toXML("root")
'<root><anotherbook>bye</anotherbook><book><anotherbook><somethingelse><thisislong>test</thisislong></somethingelse></anotherbook>welcome</book>test</root>'
HTH!
--- Heiko.