[Python-Dev] Replacing slots with addmembers() (original) (raw)

Michael McLay mclay@erols.com
Sun, 11 Nov 2001 05:24:51 -0500


I just submitted a patch that replaces the slots notation with a new syntax that is more like the property descriptor. The old syntax looked as follows:

class B(object): """class B's docstring """ slots = ['a','b','c','d']

The following example will create the eequivalent of this slots example.

class B(object): """class B's docstring """ a = addmember() b = addmember() c = addmember() d = addmember()

The next example show the use of the three parameters for addmember. The doc parameter becomes the docstring for the attribute. The types parameter can be a single type or a tuple. If it is present the member_set and member_get functions will call PyObject_IsInstance to verify the member is of the defined types. The default parameter must be of one of the defined types. If the member is not populated prior to accessing the member the default value will be returned as the value of the member.

class B(object): """class B's docstring """ a = addmember(types=int, default=56, doc="a docstring") b = addmember(types=int, doc="b's docstring") c = addmember(types=(int,float), default=5.0, doc="c docstring") d = addmember(types=(str,float), default="ham", doc="d docstring")

b = B() b.a 56 B.a.doc 'a docstring' b.d 'ham' b.b Traceback (most recent call last): File "<pyshell#8>", line 1, in ? b.b TypeError: The value of B.b is of type 'type'. This is not one of the defined types b.d = 23.3 b.d = (34,) Traceback (most recent call last): File "<pyshell#9>", line 1, in ? b.d = (34,) TypeError: The type 'tuple' is not one of the declared types for B.d

The zip file submitted with the patch includes a more detailed description of the patch. I hope the feature freeze won't rule out the patch for 2.2. The whole patch, including all of the test cases is less than 500 lines. My concern is that if slots isn't fixed prior to releasing 2.2 we'll be stuck with the rather limited and ugly syntax Guido cooked up to test the capabilities of member descriptors. The patch also takes steps to isolate the member descriptor code from type_new. The type checking code is brain dead simple and only required about 20 lines of code. It is fully contained in the new member descriptor that was added. The cost to test if a type check is required is a single C compare.

I'll be at an out of town meeting until next Saturday and I'm not sure if I'll have Internet access.