Gabor Urban wrote:
Hi guys,
I am building a nested data structure with the following compontens:
<>
class Item:
def __init__(self, pId, pChange, pComment):
self.ID = pId
self.Delta = pChange
self.Comment = pComment
def PrintItem(self):
str = '%s,%s,%s'%(self.ID,self.Delta,self.comment)
return str
class Package:
def __init__(self, pSerial, pDate, pOwner, pSchema):
self.serial = pSerial
self.date = pDate
self.owner = pOwner
self.schema = pSchema
self.items = []
def insertItem(self, pItem):
self.items.append(pItem)
def printPackage(self):
lines = []
str = '%s,%s,%s,%s'%(self.serial,self.date,self.owner,self.schema)
number = self.items.length
for idx in xrange(number):
line = ''
istr = self.items[idx].PrintItem()
line = str + ',' + istr
lines.append(line)
return lines
<>
The above structure is processed with next code:
<>
size = len(packages)
package = None
for index in xrange(size):
logger.info('PrettyPrinting package id=%d',index)
oplines = []
oplines = packages[index].printPackage()
for i in xrange(oplines.length):
data.append(oplines[i])
<>
I've got the next error message:
' Traceback (most recent call last):
File "XmlHistory_orig.py", line 203, in ?
oplines = packages[index].printPackage()
TypeError: unbound method printPackage() must be called with Package
instance as first argument (got nothing instead) '
I did give a try to access the fields directly
<>
packages = []
data = []
size = len(packages)
for index in xrange(size):
str =
'%s,%s,%s,%s'%(packages[index].serial,packages[index].date,packages[index].owner,packages[index].schema)
itemnum = len(packages[index].items)
oplines = []
for itemIndx in xrange(itemnum):
element =
'%s,%s,%s'%(packages[index].items[itemIdx].ID,packages[index].items[itemIdx].Delta,packages[index].items[itemIdx].comment)
oplines.append(str + ','+elemt)
<>
Error:
Traceback (most recent call last):
File "XmlHistory.py", line 204, in ?
str =
'%s,%s,%s,%s'%(packages[index].serial,packages[index].date,packages[index].owner,packages[index].schema)
AttributeError: class Package has no attribute 'serial'
The strange in this issue for me, that I do not see why are the class
methods and fields lost.
Any idea is wellcome.
Gabor
Ok here are some suggestions :
1/ do not name a method PrintItem if the method does not print anything
(it does not)
2/ use the __str__ method to return a nice representation of your objects
3/ use pythonic iteration controls
4/ be consistant with your naming convention, your Item's attributes
start with an Uppercase letter, Package's attributes with a lowercase
one. (I suggest the lowercase)
class Item(object):
def __init__(self, pId, pChange, pComment):
self.id = pId
self.delta = pChange
self.comment = pComment
def __str__(self):
return self.__class__.__name__ + ':' + str(self.__dict__)
class Package(object):
def __init__(self, pSerial, pDate, pOwner, pSchema):
self.serial = pSerial
self.date = pDate
self.owner = pOwner
self.schema = pSchema
self.items = []
def insertItem(self, pItem):
self.items.append(pItem)
def __str__(self):
_dict = self.__dict__.copy()
_dict['items'] = [str(item) for item in self.items]
return self.__class__.__name__ + ':' + str(_dict)
i1 = Item('a', 'b', 'c')
i2 = Item('foo', 'bar', 'baz')
p = Package(1,2,3,4)
p.insertItem(i1)
p.insertItem(i2)
packages = [p]
for package in packages:
print package
>>> Package:{'date': 2, 'owner': 3, 'serial': 1, 'schema': 4, 'items':
["Item:{'comment': 'c', 'id': 'a', 'delta': 'b'}", "Item:{'comment':
'baz', 'id': 'foo', 'delta': 'bar'}"]}
Regarding the error you get, it seems you've stored the class itself,
instead instances.
The error should be in the way you've built the package list, but you
did not provide the code.
JM
--
http://mail.python.org/mailman/listinfo/python-list