It seems like we can adopt properties and __slots__ piecemeal.
1) Add a foo = property(foo, setFoo, None, None) call for each property.
Monitor performance to verify it doesn't go down. If it doesn't, we're
no worse off than we were.
Users can (almost) interchange the old calling scheme with the
new. The "almost" is that there's a name collision between
the get method .foo() and the property .foo . You either have
to rename the get method or let it become inaccessible directly.
We can't eliminate the accessor methods entirely, because
they're needed to create the property from. Likewise, we
can't eliminate ._fields because we have to store the
dictionary *somewhere*. We could delete the accessor methods
after creating the property, or create the accessor functions
in the constructor (messy?).
Tavis, can you post the .field algorithm you were considering?
2) Sometime later, migrate the docstrings into the properties.
3) Sometime later, add __slots__ . Wait a while for __slots__ to
mature and possibly change. If people write 'self.foa = 1234'
instead of 'self.foo = 1234' in the meantime, they'll be no worse off
than they are under normal Python practice.
The docs are ambiguous about whether __slots__ gives a speed
performance. If it's implemented the way local variables are,
it would be a big speed improvement, because it could do list
subscripting rather than dictionary lookup. On the other hand,
if every access implicitly does
index = self.__slots__.index(foo)
performance may be worse than with a __dict__.
If people will be changing their servlets to eliminate (), it's
better to do it now rather than later when more sites are deployed,
and especially before 1.0. Otherwise, we'll be stuck with
.foo() and .setFoo() forever.
On the other hand, switching over to properties will require
significant developer work, so it 'tain't gonna happen unless
somebody is sufficiently motivated to do it.
For an easier and smaller change if we don't use properties, note that
Perl programmers use one method for getting and setting.
.foo(newvalue=NotGiven) would eliminate the need for .setFoo and thus
cut down on the multiplicity of accessor methods.
-Mike (Iron) Orr, iron@... (if mail problems: mso@...)
http://iron.cx/ English * Esperanto * Russkiy * Deutsch * Espan~ol