A class for C-like structuures in Python

Thomas Gagne tgagne at ix.netcom.com
Wed Aug 9 07:51:16 EDT 2000


Whoops!!

When I run my test program, I get a tracback that looks like __getattr__ calls
__checkname which calls __getattr__ which calls __checkname.... but I don't
see it in the code.

Traceback (innermost last):
  File "./CStructure.py", line 14, in __checkname
    if not self.members.has_key(name):
  File "./CStructure.py", line 18, in __getattr__
    self.__checkname(name)
  File "./CStructure.py", line 14, in __checkname
    if not self.members.has_key(name):
  File "./CStructure.py", line 18, in __getattr__
    self.__checkname(name)
  File "./CStructure.py", line 14, in __checkname

.. until finally

  File "./CStructure.py", line 18, in __getattr__
    self.__checkname(name)
  File "./CStructure.py", line 14, in __checkname
    if not self.members.has_key(name):
  File "./CStructure.py", line 18, in __getattr__
    self.__checkname(name)
RuntimeError: Maximum recursion depth exceeded
-------------- next part --------------
import struct

class CStructure:
	def __init__(self, theTuples):
		self.fmt = ''
		self.members = {}
		self.shape = theTuples

		for n,f in self.shape:
			self.members[n] = None
			self.fmt = self.fmt + f

	def __checkname(self, name):
		if not self.members.has_key(name):
			raise AttributeError, "No struct-field is named " + name

	def __getattr__(self, name):
		self.__checkname(name)
		return self.members[name]

	def __setattr__(self, name, value):
		self.__checkname(name)
		self.members[name] = value
		return value

	def getFormat(self):
		return self.fmt

	def __len__(self):
		return struct.calcsize(self.fmt)

	def asBytes(self):
		self.bytes = ''

		for n,f in self.shape:
			if f[-1] == 'x':
				self.bytes = self.bytes + struct.pack(f)
			else:
				self.bytes = self.bytes + struct.pack(f, self.members[n])

		return self.bytes


More information about the Python-list mailing list