blob: efa5424f4ec68a4a4d6097a5ae5a7818340e698e [file] [log] [blame]
Tim Peters6d6c1a32001-08-02 04:15:00 +00001Project: core implementation
2****************************
3
Guido van Rossumb016da32001-10-26 04:31:54 +00004Still to do (by priority)
5-------------------------
Tim Peters6d6c1a32001-08-02 04:15:00 +00006
Guido van Rossum43b9a082001-09-28 18:19:21 +00007Support mixed multiple inheritance from classic and new-style classes?
Guido van Rossumb016da32001-10-26 04:31:54 +00008That would be cool and make new-style classes much more usable (it
9would remove most of the reasons not to use them for new projects).
10How hard would this be?
11
12Do something with the tp_cache slot? This is (was?) intended to cache
13all the class attributes from all base classes; a key would be deleted
14when the base class attribute is. But the question is, are the
15savings worth it? So I may not do this.
Guido van Rossum43b9a082001-09-28 18:19:21 +000016
Guido van Rossumeb9f3842001-08-30 21:18:04 +000017Check for conflicts between base classes. I fear that the rules used
18to decide whether multiple bases have conflicting instance variables
19aren't strict enough. I think that sometimes two different classes
Guido van Rossumb016da32001-10-26 04:31:54 +000020adding __dict__ may be incompatible after all. (I may not do this.
21Who cares.)
Guido van Rossumeb9f3842001-08-30 21:18:04 +000022
23Check for order conflicts. Suppose there are two base classes X and
24Y. Suppose class B derives from X and Y, and class C from Y and X (in
25that order). Now suppose class D derives from B and C. In which
26order should the base classes X and Y be searched? This is an order
27conflict, and should be disallowed; currently the test for this is not
Guido van Rossumb016da32001-10-26 04:31:54 +000028implemented. (I may not do this. Who cares.)
29
30Allow assignment to __bases__? (I don't think there's a demand for
31this.)
Guido van Rossumeb9f3842001-08-30 21:18:04 +000032
Guido van Rossumeb9f3842001-08-30 21:18:04 +000033Done (mostly)
34-------------
35
Guido van Rossum3133f412001-11-01 21:36:48 +000036Add __del__ handlers. I asked for a motivation on python-dev and
37nobody piped up. Yet I expect it will be asked for later. There
38were some GC issues, but these have now also been dealt with, thanks
39to Neil Schemenauer.
Guido van Rossumb73efee2001-11-01 04:11:06 +000040
Guido van Rossumb016da32001-10-26 04:31:54 +000041Assignment to __dict__.
42
Guido van Rossum27b7f9f2001-10-12 17:43:43 +000043More performance work -- one particular test, test_descr.inherits(),
44is still about 50% slower with dynamic classes. :-( The approach of
45choice would be:
46
47 Add a list of weak refs to derived classes to each dynamic
48 class, and trap setattr+delattr on the base class so that they
49 update the tp_XXX slot in each derived class when the base class
50 __XXX__ gets set or deleted. More work, but more gain (zero waste
51 in slot_tp_XXX when __XXX__ is not overridden).
52*** That's done now, with great success. ***
53
Guido van Rossum50fda3b2001-10-04 19:46:06 +000054Make __dynamic__ the default. *** done (but more performance work
55needs to be done). ***
56
Guido van Rossumf49a9132001-10-03 03:00:56 +000057Treat all binary operators the same way as I just did for rich
58comparison: in a <op> b, if type(a) is not type(b) and isinstance(b,
59type(a)), try b.__rop__(a) before trying a.__op__(b). *** Done. ***
60
Guido van Rossumc39553a2001-09-25 06:20:52 +000061Fix comparisons. There's some nasty stuff here: when two types are
62not the same, and they're not instances, the fallback code doesn't
63account for the possibility that they might be subtypes of a common
64base type that defines a comparison. *** I believe this is now done,
65but it's a bit of a mess. ***
66
67Allow __class__ assignment. *** done ***
68
69Change __getattr__ to be more like classic __getattr__, and introduce
70a new name for new-style __getattr__. *** Done. The new-style method
71is called __getattribute__. ***
72
Guido van Rossumed8fa722001-09-20 05:27:24 +000073Make inspect and pydoc do the right thing for new-style classes. ***
74done ***
75
Guido van Rossumeb9f3842001-08-30 21:18:04 +000076Do binary operators properly. nb_add should try to call self.__add__
77and other.__radd__. I think I'll exclude base types that define any
78binary operator without setting the CHECKTYPES flag. *** This is
79done, AFAICT. Even supports __truediv__ and __floordiv__. ***
80
Tim Peters6d6c1a32001-08-02 04:15:00 +000081Fix subtype_dealloc(). This currently searches through the list of
82base types until it finds a type whose tp_dealloc is not
83subtype_dealloc. I think this is not safe. I think the alloc/dealloc
84policy needs to be rethought. *** There's an idea here that I haven't
85worked out yet: just as object creation now has separate API's tp_new,
86tp_alloc, and tp_init, destruction has tp_dealloc and tp_free. (Maybe
87tp_fini should be added to correspond to tp_init?) Something
88could/should be done with this. ***
89
90Clean up isinstance(), issubclass() and their C equivalents. There
91are a bunch of different APIs here and not all of them do the right
92thing yet. There should be fewer APIs and their implementation should
93be simpler. The old "abstract subclass" test should probably
94disappear (if we want to root out ExtensionClass). *** I think I've
95done 90% of this by creating PyType_IsSubtype() and using it
96appropriately. For now, the old "abstract subclass" test is still
97there, and there may be some places where PyObject_IsSubclass() is
98called where PyType_IsSubtype() would be more appropriate. ***
99
Tim Peters6d6c1a32001-08-02 04:15:00 +0000100Clean up the GC interface. Currently, tp_basicsize includes the GC
101head size iff tp_flags includes the GC flag bit. This makes object
102size math a pain (e.g. to see if two object types have the same
103instance size, you can't just compare the tp_basicsize fields -- you
104have to conditionally subtract the GC head size). Neil has a patch
105that improves the API in this area, but it's backwards incompatible.
106(http://sf.net/tracker/?func=detail&aid=421893&group_id=5470&atid=305470)
107I think I know of a way to fix the incompatibility (by switching to a
108different flag bit). *** Tim proposed a better idea: macros to access
109tp_basicsize while hiding the nastiness. This is done now, so I think
Guido van Rossumeb9f3842001-08-30 21:18:04 +0000110the rest of this task needn't be done. *** *** Neil checked in a
111much improved version of his idea, and it's all squared away. ***
Tim Peters6d6c1a32001-08-02 04:15:00 +0000112
113Make the __dict__ of types declared with Python class statements
114writable -- only statically declared types must have an immutable
115dict, because they're shared between interpreter instances. Possibly
116trap writes to the __dict__ to update the corresponding tp_<slot> if
117an __<slot>__ name is affected. *** Done as part of the next task. ***
118
119It should be an option (maybe a different metaclass, maybe a flag) to
120*not* merge __dict__ with all the bases, but instead search the
121__dict__ (or __introduced__?) of all bases in __mro__ order. (This is
122needed anyway to unify classes completely.) *** Partly done.
123Inheritance of slots from bases is still icky: (1) MRO is not always
124respected when inheriting slots; (2) dynamic classes can't add slot
125implementations in Python after creation (e.g., setting C.__hash__
126doesn't set the tp_hash slot). ***
127
128Universal base class (object). How can we make the object class
129subclassable and define simple default methods for everything without
130having these inherited by built-in types that don't want these
131defaults? *** Done, really. ***
132
133Add error checking to the MRO calculation. *** Done. ***
134
135Make __new__ overridable through a Python class method (!). Make more
136of the sub-algorithms of type construction available as methods. ***
137After I implemented class methods, I found that in order to be able
138to make an upcall to Base.__new__() and have it create an instance of
139your class (rather than a Base instance), you can't use class methods
140-- you must use static methods. So I've implemented those too. I've
141hooked up __new__ in the right places, so the first part of this is
142now done. I've also exported the MRO calculation and made it
143overridable, as metamethod mro(). I believe that closes this topic
144for now. I expect that some warts will only be really debugged when
145we try to use this for some, eh, interesting types such as tuples. ***
146
Guido van Rossum04156202001-08-08 16:57:43 +0000147 There was a sequel to the __new__ story (see checkins). There
148 still is a problem: object.__new__ now no longer exists, because
149 it was inherited by certain extension types that could break. But
150 now when I write
151
152 class C(object):
153 def __new__(cls, *args):
154 "How do I call the default __new__ implementation???"
155
Guido van Rossum42a8c2b2001-08-09 20:25:58 +0000156 This was resolved nicely by putting object.__new__ back but not
157 inheriting __new__ from object when the subtype is a built-in or
158 extension type.
159
Tim Peters6d6c1a32001-08-02 04:15:00 +0000160More -- I'm sure new issues will crop up as we go.
161
162
163Project: loose ends and follow-through
164**************************************
165
Guido van Rossumeb9f3842001-08-30 21:18:04 +0000166Still to do
167-----------
Tim Peters6d6c1a32001-08-02 04:15:00 +0000168
169Exceptions should be types. This changes the rules, since now almost
170anything can be raised (as maybe it should). Or should we strive for
171enforcement of the convention that all exceptions should be derived
172from Exception? String exceptions will be another hassle, to be
173deprecated and eventually ruled out.
174
175Standardize a module containing names for all built-in types, and
176standardize on names. E.g. should the official name of the string
177type be 'str', 'string', or 'StringType'?
178
179Create a hierarchy of types, so that e.g. int and long are both
180subtypes of an abstract base type integer, which is itself a subtype
181of number, etc. A lot of thinking can go into this!
182
183*** NEW TASK??? ***
184Implement "signature" objects. These are alluded to in PEP 252 but
185not yet specified. Supposedly they provide an easily usable API to
186find out about function/method arguments. Building these for Python
187functions is simple. Building these for built-in functions will
188require a change to the PyMethodDef structure, so that a type can
189provide signature information for its C methods. (This would also
190help in supporting keyword arguments for C methods with less work than
191PyArg_ParseTupleAndKeywords() currently requires.) But should we do
192this? It's additional work and not required for any of the other
193parts.
194
Guido van Rossumeb9f3842001-08-30 21:18:04 +0000195Done (mostly)
196-------------
197
198Make more (most?) built-in types act as their own factory functions.
199*** Done for all reasonable built-in types. ***
200
201Make more (most?) built-in types subtypable -- with or without
202overridable allocation. *** This includes descriptors! It should be
203possible to write descriptors in Python, so metaclasses can do clever
204things with them. *** *** Done for most reasonable built-in types,
205except for descriptors ***
206
Tim Peters6d6c1a32001-08-02 04:15:00 +0000207
208Project: making classes use the new machinery
209*********************************************
210
211Tasks:
212
213Try to get rid of all code in classobject.c by deferring to the new
214mechanisms. How far can we get without breaking backwards
215compatibility? This is underspecified because I haven't thought much
216about it yet. Can we lose the use of PyInstance_Check() everywhere?
Guido van Rossumeb9f3842001-08-30 21:18:04 +0000217I would hope so! *** I'm dropping this goal for now -- classic
218classes will be 99% unchanged. ***
Tim Peters6d6c1a32001-08-02 04:15:00 +0000219
220
221Project: backwards compatibility
222********************************
223
224Tasks:
225
226Make sure all code checks the proper tp_flags bit before accessing
227type object fields.
228
229Identify areas of incompatibility with Python 2.1. Design solutions.
230Implement and test.
231
232Some specific areas: a fair amount of code probably depends on
233specific types having __members__ and/or __methods__ attributes.
234These are currently not present (conformant to PEP 252, which proposes
235to drop them) but we may have to add them back. This can be done in a
236generic way with not too much effort. Tim adds: Perhaps that dir(object)
237rarely returns anything but [] now is a consequence of this. I'm very
238used to doing, e.g., dir([]) or dir("") in an interactive shell to jog my
239memory; also one of the reasons test_generators failed.
240
241Another area: going all the way with classes and instances means that
242type(x) == types.InstanceType won't work any more to detect instances.
243Should there be a mode where this still works? Maybe this should be
244the default mode, with a warning, and an explicit way to get the new
245way to work? (Instead of a __future__ statement, I'm thinking of a
246module global __metaclass__ which would provide the default metaclass
247for baseless class statements.)
248
249
250Project: testing
251****************
252
253Tasks:
254
255Identify new functionality that needs testing. Conceive unit tests
256for all new functionality. Conceive stress tests for critical
257features. Run the tests. Fix bugs. Repeat until satisfied.
258
259Note: this may interact with the branch integration task.
260
261
Tim Petersf9803012001-08-02 22:06:35 +0000262Project: integration with main branch *** This is done - tim ***
Tim Peters6d6c1a32001-08-02 04:15:00 +0000263*************************************
264
265Tasks:
266
267Merge changes in the HEAD branch into the descr-branch. Then merge
268the descr-branch back into the HEAD branch.
269
270The longer we wait, the more effort this will be -- the descr-branch
271forked off quite a long time ago, and there are changes everywhere in
272the HEAD branch (e.g. the dict object has been radically rewritten).
273
274On the other hand, if we do this too early, we'll have to do it again
275later.
276
277Note from Tim: We should never again wait until literally 100s of files
278are out of synch. I don't care how often I need to do this, provided only
279that it's a tractable task each time. Once per week sounds like a good
280idea. As is, even the trunk change to rangeobject.c created more than its
281proper share of merge headaches, because it confused all the other reasons
282include file merges were getting conflicts (the more changes there are, the
283worse diff does; indeed, I came up with the ndiff algorithm in the 80s
284precisely because the source-control diff program Cray used at the time
285produced minimal but *senseless* diffs, thus creating artificial conflicts;
286paying unbounded attention to context does a much better job of putting
287changes where they make semantic sense too; but we're stuck with Unix diff
288here, and it isn't robust in this sense; if we don't keep its job simple,
289it will make my job hell).
290
291Done:
292To undo or rename before final merge: Modules/spam.c has worked its
293way into the branch Unix and Windows builds (pythoncore.dsp and
294PC/config.c); also imported by test_descr.py. How about renaming to
Tim Petersf9803012001-08-02 22:06:35 +0000295xxsubtype.c (whatever) now? *** this is done - tim ***
Tim Peters6d6c1a32001-08-02 04:15:00 +0000296
297
298Project: performance tuning
299***************************
300
301Tasks:
302
303Pick or create a general performance benchmark for Python. Benchmark
304the new system vs. the old system. Profile the new system. Improve
305hotspots. Repeat until satisfied.
306
307Note: this may interact with the branch integration task.
308
309
310Project: documentation
311**********************
312
313Tasks:
314
315Update PEP 252 (descriptors). Describe more of the prototype
316implementation
317
318Update PEP 253 (subtyping). Complicated architectural wrangling with
319metaclasses. There is an interaction between implementation and
320description.
321
322Write PEP 254 (unification of classes). This should discuss what
323changes for ordinary classes, and how we can make it more b/w
324compatible.
325
326Other documentation. There needs to be user documentation,
327eventually.
328
329
330Project: community interaction
331******************************
332
333Tasks:
334
335Once the PEPs are written, solicit community feedback, and formulate
336responses to the feedback. Give the community enough time to think
337over this complicated proposal. Provide the community with a
338prototype implementation to test. Try to do this *before* casting
339everything in stone!