[Python-Dev] draft pep: backwards compatibility
glyph at divmod.com
glyph at divmod.com
Sat Jun 20 00:40:36 CEST 2009
On 07:06 pm, python at rcn.com wrote:
>Not sure why we need yet another pep on the subject. Just update PEP 5
Hmm. This is a good point; it might make sense to have a more specific
PEP for library compatibility as opposed to language compatibility
though, since language compatibility is necessarily a vaguer concept.
>Also, I think there is a certain amount of wishful thinking here.
>Ideally, we could approve a tiny PEP with just a few bullet points and
>it would eliminate the need for all of the complicated decision making
>that we usually go through. Ideally, we could make all decisions in
>advance of seeing the facts for a given situation. ISTM, this pep is
>wishing away the actual complexity of making software design decisions.
This is not about making design decisions. This is about how to treat
the *output* of design decisions.
A really important part of this PEP, as I alluded to previously, is the
part that tells developers what *they* should be doing if they want
their python code to function on the next release of the interpreter.
Right now, the rule to write software that will not break with the next
Python release is "read the minds of the python core committers and hope
that you do not do anything with the stdlib that they don't like".
Along with this there are several rules you can infer that are probably
true most of the time: don't call stuff starting with "_", don't monkey-
patch anything, don't use dynamic class replacement on objects from
classes other than your own, don't depend on the depth of inheritance
hierarchies (for example, no ".__bases__.__bases__"), make sure
your tests run without producing any DeprecationWarnings, be mindful of
potential namespace conflicts when adding attributes to classes that
inherit from other libraries. I don't think all these things are
written down in one place though.
>Another sticking point about preserving features across releases arises
>if the feature itself is hazardous in some way (like have a security
>hole or some such). The contextlib.nested() function was an example.
>We resolved the question after a long and thoughtful discussion; I
>don't think that decision making process could have been solved in
>advance by a bullet-point in a general purpose process PEP.
You are correct that nothing in Python's policy could have dictated how
this problem could be resolved. However, the policy can most definitely
state how to deal with code using contextlib.nested in the interim
before it has been changed to use the new syntax: to wit, that
contextlib.nested has to stick around, continue to do the (broken) thing
that it did before, and emit a DeprecationWarning indicating the new
syntax. The existing policy in PEP 5 already does this, but doesn't
offer guidelines on *how* to do this for lots of different types of
changes. For example, how do you issue a deprecation warning for a new
parameter you want to require application code to accept? How do you
change the name of a parameter, to wit, do you need to expect that all
arguments can validly be used as keyword arguments? How do you
determine an appropriate stack-depth, etc?
More information about the Python-Dev