Kragen Sitaker kragen at
Tue Oct 16 18:05:31 CEST 2001

# I occasionally find myself writing code like the following:
# class Point:
#     def __init__(self, x, y):
#         self.x = x
#         self.y = y
# and that's the whole class.  This little module lets me write the above code
# as
# Point = defstruct('x', 'y')
# and have done with it.
# The name is taken from Common Lisp; the syntax is taken from MzScheme's
# define-struct and is similar to the Common Lisp boa constructor syntax.
# define-record-type from SRFI 9 is nasty and Scheme-specific enough that
# I didn't use it.
# I hereby dedicate this code to the public domain and disavow any copyright
# interest in it.
# -- Kragen Sitaker, 2001-10-16

def defstruct(*fields):
    class Struct:
        def __init__(self, *contents):
            if len(contents) != len(self.structfields):
                raise TypeError, (
                    "wrong number of arguments: expected %d %s, got %d" %
            for fieldnum in range(len(contents)):
                setattr(self, self.structfields[fieldnum], contents[fieldnum])
    Struct.structfields = fields
    return Struct    
def test():
    point = defstruct('x', 'y')
    p1 = point(1, 2)
    assert p1.x == 1
    assert p1.y == 2
    complex = defstruct('real', 'imag')
    assert point is not complex
    assert isinstance(p1, point)
    assert not isinstance(p1, complex)

<kragen at>       Kragen Sitaker     <>
Perilous to all of us are the devices of an art deeper than we possess
       -- Gandalf the White [J.R.R. Tolkien, "The Two Towers", Bk 3, Ch. XI]

More information about the Python-list mailing list