<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Wed, Jan 11, 2017 at 9:37 PM, Steven D'Aprano <span dir="ltr"><<a href="mailto:steve@pearwood.info" target="_blank">steve@pearwood.info</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I have a proposal for an Informational PEP that lists things which will<br>
<br>
not change in Python. If accepted, it could be linked to from the signup<br>
<br>
page for the mailing list, and be the one obvious place to point<br>
<br>
newcomers to if they propose the same old cliches.<br>
<br>
<br>
<br>
Thoughts?<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
* * * * * * * * * *<br>
<br>
<br>
<br>
<br>
<br>
PEP: XXX<br>
<br>
Title: Things that won't change in Python<br>
<br>
Version: $Revision$<br>
<br>
Last-Modified: $Date$<br>
<br>
Author: Steven D'Aprano <<a href="mailto:steve@pearwood.info">steve@pearwood.info</a>><br>
<br>
Status: Draft<br>
<br>
Type: Informational<br>
<br>
Content-Type: text/x-rst<br>
<br>
Created: 11-Jan-2017<br>
<br>
Post-History: 12-Jan-2017<br>
<br>
<br>
<br>
<br>
<br>
Abstract<br>
<br>
========<br>
<br>
<br>
<br>
This PEP documents things which will not change in future versions of Python.<br>
<br>
<br>
<br>
<br>
<br>
Rationale<br>
<br>
=========<br>
<br>
<br>
<br>
This PEP hopes to reduce the noise on `Python-Ideas <<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a>><wbr>`_<br>
<br>
and other mailing lists.  If you have a proposal for future Python<br>
<br>
development, and it requires changing one of the things listed here, it<br>
<br>
is dead in the water and has **no chance of being accepted**, either because<br>
<br>
the benefit is too little, the cost of changing the language (including<br>
<br>
backwards compatibility) is too high, or simply because it goes against<br>
<br>
the design preferred by the BDFL.<br>
<br>
<br>
<br>
Many of these things are already listed in the `FAQs <<a href="https://docs.python.org/3/faq/design.html" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html</a>>`_.<br>
<br>
You should be familiar with both Python and the FAQs before proposing<br>
<br>
changes to the language.<br>
<br>
<br>
<br>
Just because something is not listed here does not necessarily mean that<br>
<br>
it will be changed.  Each proposal will be weighed on its merits, costs<br>
<br>
compared to benefits.  Sometimes the decision will come down to a matter<br>
<br>
of subjective taste, in which case the BDFL has the final say.<br>
<br>
<br>
<br>
<br>
<br>
Language Direction<br>
<br>
==================<br>
<br>
<br>
<br>
Python 3<br>
<br>
--------<br>
<br>
<br>
<br>
This shouldn't need saying, but Python 3 will not be abandoned.<br>
<br>
<br>
<br>
<br>
<br>
Python 2.8<br>
<br>
----------<br>
<br>
<br>
<br>
There will be `no official Python 2.8 <<a href="https://www.python.org/dev/peps/pep-0404/" rel="noreferrer" target="_blank">https://www.python.org/dev/<wbr>peps/pep-0404/</a>>`_ ,<br>
<br>
although third parties are welcome to fork the language, backport Python<br>
<br>
3 features, and maintain the hybrid themselves.  Just don't call it<br>
<br>
"Python 2.8", or any other name which gives the impression that it<br>
<br>
is maintained by the official Python core developers.<br>
<br>
<br>
<br>
<br>
<br>
Type checking<br>
<br>
-------------<br>
<br>
<br>
<br>
Duck-typing remains a fundamental part of Python and `type checking <<a href="https://www.python.org/dev/peps/pep-0484/#non-goals" rel="noreferrer" target="_blank">https://www.python.org/dev/<wbr>peps/pep-0484/#non-goals</a>>`_<br>
<br>
will not be mandatory.  Even if the Python interpreter someday gains a<br>
<br>
built-in type checker, it will remain optional.<br>
<br>
<br>
<br>
<br>
<br>
Syntax<br>
<br>
======<br>
<br>
<br>
<br>
Braces<br>
<br>
------<br>
<br>
<br>
<br>
It doesn't matter whether optional or mandatory, whether spelled ``{ }``<br>
<br>
like in C, or ``BEGIN END`` like in Pascal, braces to delimit code blocks<br>
<br>
are not going to happen.<br>
<br>
<br>
<br>
For another perspective on this, try running ``from __future__ import braces``<br>
<br>
at the interactive interpreter.<br>
<br>
<br>
<br>
(There is a *tiny* loophole here: multi-statement lambda, or Ruby-like code<br>
<br>
blocks have not been ruled out.  Such a feature may require some sort of<br>
<br>
block delimiter -- but it won't be braces, as they clash with the syntax<br>
<br>
for dicts and sets.)<br>
<br>
<br>
<br>
<br>
<br>
Colons after statements that introduce a block<br>
<br>
------------------------------<wbr>----------------<br>
<br>
<br>
<br>
Statements which introduce a code block, such as ``class``, ``def``, or<br>
<br>
``if``, require a colon.  Colons have been found to increase readability.<br>
<br>
See the `FAQ <<a href="https://docs.python.org/3/faq/design.html#why-are-colons-required-for-the-if-while-def-class-statements" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html#why-are-<wbr>colons-required-for-the-if-<wbr>while-def-class-statements</a>>`_<br>
<br>
for more detail.<br>
<br>
<br>
<br>
<br>
<br>
End statements<br>
<br>
--------------<br>
<br>
<br>
<br>
Python does not use ``END`` statements following blocks.  Given significant<br>
<br>
indentation, they are redundant and add noise to the source code.  If you<br>
<br>
really want end markers, use a comment ``# end``.<br>
<br>
<br>
<br>
<br>
<br>
Explicit self<br>
<br>
-------------<br>
<br>
<br>
<br>
Explicit ``self`` is a feature, not a bug.  See the<br>
<br>
`FAQ <<a href="https://docs.python.org/3/faq/design.html#why-must-self-be-used-explicitly-in-method-definitions-and-calls" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html#why-must-self-<wbr>be-used-explicitly-in-method-<wbr>definitions-and-calls</a>>`_<br>
<br>
for more detail.<br>
<br>
<br>
<br>
<br>
<br>
Print function<br>
<br>
--------------<br>
<br>
<br>
<br>
The ``print`` statement in Python 1 and 2 was a mistake that Guido long<br>
<br>
regretted.  Now that it has been corrected in Python 3, it will not be<br>
<br>
reverted back to a statement.  See `PEP 3105 <<a href="https://www.python.org/dev/peps/pep-3105/" rel="noreferrer" target="_blank">https://www.python.org/dev/<wbr>peps/pep-3105/</a>>`_<br>
<br>
for more details.<br>
<br>
<br>
<br>
<br>
<br>
Significant indentation<br>
<br>
-----------------------<br>
<br>
<br>
<br>
`Significant indentation <<a href="https://docs.python.org/3/faq/design.html#why-does-python-use-indentation-for-grouping-of-statements" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html#why-does-<wbr>python-use-indentation-for-<wbr>grouping-of-statements</a>>`_<br>
<br>
is a core feature of Python.<br>
<br>
<br>
<br>
<br>
<br>
Other syntax<br>
<br>
------------<br>
<br>
<br>
<br>
Python will not use ``$`` as syntax.  Guido doesn't like it.  (But it<br>
<br>
is okay to use ``$`` in DSLs like template strings and regular<br>
<br>
expressions.)<br>
<br>
<br>
<br>
<br>
<br>
Built-in Functions And Types<br>
<br>
============================<br>
<br>
<br>
<br>
Strings<br>
<br>
-------<br>
<br>
<br>
<br>
Strings are `immutable <<a href="https://docs.python.org/3/faq/design.html#why-are-python-strings-immutable" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html#why-are-<wbr>python-strings-immutable</a>>`_<br>
<br>
and represent Unicode code points, not bytes.<br>
<br>
<br>
<br>
<br>
<br>
Bools<br>
<br>
-----<br>
<br>
<br>
<br>
``bool`` is a subclass of ``int``, with ``True == 1`` and ``False == 0``.<br>
<br>
This is mostly for historical reasons, but the benefit of changing it now<br>
<br>
is too low to be worth breaking backwards compatibility and the enormous<br>
<br>
disruption it would cause.<br>
<br>
<br>
<br>
<br>
<br>
Built-in functions<br>
<br>
------------------<br>
<br>
<br>
<br>
Python is an object-oriented language, but it is not *purely*<br>
<br>
object-oriented. Not everything needs to be `a method of some object  <<a href="http://steve-yegge.blogspot.com.au/2006/03/execution-in-kingdom-of-nouns.html" rel="noreferrer" target="_blank">http://steve-yegge.blogspot.<wbr>com.au/2006/03/execution-in-<wbr>kingdom-of-nouns.html</a>>`_,<br>
<br>
and functions have their advantages.  See the<br>
<br>
`FAQ <<a href="https://docs.python.org/3/faq/design.html#why-does-python-use-methods-for-some-functionality-e-g-list-index-but-functions-for-other-e-g-len-list" rel="noreferrer" target="_blank">https://docs.python.org/3/<wbr>faq/design.html#why-does-<wbr>python-use-methods-for-some-<wbr>functionality-e-g-list-index-<wbr>but-functions-for-other-e-g-<wbr>len-list</a>>`_<br>
<br>
for more detail.<br>
<br>
<br>
<br>
<br>
<br>
Other Language Features<br>
<br>
=======================<br>
<br>
<br>
<br>
The interactive interpreter<br>
<br>
---------------------------<br>
<br>
<br>
<br>
The default prompt is ``>>> ``. Guido likes it that way.<br>
<br>
<br>
<br>
<br>
<br>
Copyright<br>
<br>
=========<br>
<br>
<br>
<br>
This document has been placed in the public domain.<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
..<br>
<br>
   Local Variables:<br>
<br>
   mode: indented-text<br>
<br>
   indent-tabs-mode: nil<br>
<br>
   sentence-end-double-space: t<br>
<br>
   fill-column: 70<br>
<br>
   coding: utf-8<br>
<br>
   End:<br>
<br>
______________________________<wbr>_________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/<wbr>codeofconduct/</a><br>
</blockquote></div><br><br></div><div class="gmail_extra">I like the idea a lot.  <br><br>Some suggested changes:<br><br></div><div class="gmail_extra">1. In the introduction, I might add a sentence saying that flags or some other options to change these behaviors will also not be added.<br></div><div class="gmail_extra">2. I might combine the "braces" and "end statements" into a single section, perhaps "code blocks".  At the very least I would have them adjacent to each other in the list.<br><div class="gmail_extra">3. I would add in the "explicit self" section that "self" will also not be made a keyword.<br></div>4. I think either adding a bit more detail about the rationale for the decisions, or perhaps better yet having an entry in the FAQ explaining the rationale for each of these decisions that is linked from here, would help avoid arguments (or maybe it could encourage arguments about the rationale, this is debatable).<br></div><div class="gmail_extra">5. I would add some examples for the "built-in functions" part, such as "length" and "del".<br></div><div class="gmail_extra">6. I don't think the "Strings" part makes sense to those not already familiar with unicode.  I think a couple more sentences explaining the difference, and mentioning that the python 2 behavior is what won't be used, is necessary so such people understand what they should avoid suggesting.<br></div><div class="gmail_extra">7. I am not sure what "Python will not use ``$`` as syntax." means.  Are you referring to a particular common use of "$", or that it won't be used at all for any reason?  If the latter, I would add "?" to that as well.<br></div><div class="gmail_extra">8. In the "python 3" section, perhaps mention that "python 4" will be a continuation of python 3 and will be a major backwards-compatibility break like python 2 -> 3 was.<br></div><div class="gmail_extra"><br></div><div class="gmail_extra">Some sections I would suggest adding<br><br></div>1. A section about indexing, and include that the built-in "range" follows the indexing rules.  You can mention that custom classes can use whatever indexing rules they want but breaking the python convention will make it very, very hard for others to use the class.  You can also mention that users can also make a custom range function that follows whatever rules they like.<br><div class="gmail_extra">2. Assignment will never be allowed inside expressions.<br></div><div class="gmail_extra">3. From what I understand, Guido doesn't want a "range" literal.<br></div><div class="gmail_extra">4. Things like "range", "map", "dict.keys", "dict.values", and "dict.items" will never go back to the Python 2 behavior of returning lists.  Also clarify that the python 3 versions do not return iterators, they return instances of special-purpose, read-only classes (views in the case of the "dict" methods).<br></div><div class="gmail_extra">5. "and" and "or" are short-circuiting operations that return one of the two values given.   They will never be non-short-circuiting and they will never coerce returned values to boolean.<br>6. "xor" will not be added.<br></div><div class="gmail_extra">7. "if" will not be added to the ordinary "for" statement.<br></div><div class="gmail_extra">8. Options to change the behavior of built-in classes in incompatible ways will not be added (I may be wrong about this one, but I think it is a good rule).<br></div></div>