[Python-Dev] Policy Decisions, Judgment Calls, and Backwards Compatibility (was Re: splitext('.cshrc'))
Terry Reedy
tjreedy at udel.edu
Fri Mar 9 06:42:46 CET 2007
<glyph at divmod.com> wrote in message
news:20070309003135.7769.1063793143.divmod.xquotient.177 at joule.divmod.com...
martin at v.loewis.de wrote:
My understanding of the current backwards-compatibility policy for
Python, the one that Twisted has been trying to emulate strictly, is
that, for each potentially incompatible change, there will be:
* at least one release with a pending deprecation warning and new,
better API
* at least one release with a deprecation warning
* some number of releases later, the deprecated functionality is removed
=================================================
There is not and hardly can be any such policy for bug fixes.
Unfortunately,
* Honest people can disagree about whether a change is a bug fix or feature
addition or replacement. And there will be borderline cases regardless of
one's definition, unless one makes either category empty. (Having only one
category and hence only one change policy would simplify life but at some
cost.)
* Fixing bugs can break code just as it fixes other code.
I believe the current policy is that depending on buggy behavior, as
opposed to working around it, is proceed at your own risk. Bugs can be
fixed without notice, at the next bug fix release. On the other hand, bug
fixes can and sometime are delayed or modified in recognition of degrees of
bugginess and differences of opinions and cost-benefit analyses. But
deviations from a rigid procedure require case-by-case judgments, to me
preferably based on information-gathering and discussion and a chance to
influence judgment.
For new features that don't break code (that doesn't depend on the features
absence), the current (and somewhat new) policy is to wait until the next
minor .x feature release, skipping any micro .x.y releases (now called
bug-fix releases).
For replacement features, the policy is what you give above.
Example: f(*args) instead of apply(f, args).
At one time, the expectation was that removal could be and possibly would
be one release after deprecation. It is currently to wait until 3.0. What
it will be after that I have not seen discussed.
Semantic changes are trickier. We don't want a different API when we want
a different meaning for the currently API.
The integer division change is a mixture. Int//int replaces int/int and is
already available. But int/int will change meaning to
float(int)/float(int) rather than being removed.
So I see five categories of code change -- clear bug, possibly fuzzy bug,
semantic change, replacement, and addition -- each with different
appropriate policies. And there are mixtures that belong together in a
package.
Terry Jan Reedy
More information about the Python-Dev
mailing list