The Case Against Python 3

Mark Summerfield list at qtrac.plus.com
Fri Nov 25 03:29:38 EST 2016


On Thursday, November 24, 2016 at 7:35:03 PM UTC, bream... at gmail.com wrote:
> It's all here https://learnpythonthehardway.org/book/nopython3.html although I strongly suggest that people have large piles of sedatives to hand before reading the article.  Does me a favour though, i've been looking for another member of my dream team for some time.
> 
> Kindest regards.
> 
> Mark Lawrence.

I think the article is full of factual errors and is at best misleading and at worst downright dishonest in its criticisms of Python 3. (My only serious complaint about Python is that it doesn't support a key-ordered dict.) Anyway, here are my initial responses to some of the articles "points".

The article claims:

    "There is a high probability that Python 3 is such a failure it will kill Python."

This is despite the fact that there are more Python programmers than ever before, that there is more investment in Python programming, tools, and libraries than ever before, and that more and more new projects start out as Python 3 only.

The article says:

    "Also, it's been over a decade, maybe even multiple decades, and Python 3 still isn't above about 30% in adoption."

Python 3.0 was released in 2008, so it hasn't been a single decade. According to an analysis of PyPI downloads, Python 2-only packages have steadily declined in the past 5 years with Python 3-only packages steadily rising and about to overtake, and with a steady rise in packages that support both:
https://blogs.msdn.microsoft.com/pythonengineering/2016/03/08/python-3-is-winning/
The Python 3 Readiness web site:
http://py3readiness.org/
shows that today, 341 out of 360 of Python's most popular packages are Python 3 compatible.

The article says:

    "The fact that you can't run Python 2 and Python 3 at the same time"

This is untrue. Most Linux distributions not only ship with Python 2 and Python 3, but often end up with both installed. Modern versions of Fedora and Ubuntu depend on Python 3, but allow Python 2 to be installed side-by-side to support older software. On Windows it is easy to install both Python 2 and Python 3 and the py.exe that comes with Python 3 will detect which Python version is required and use it, if it is installed.

The article says:

    "Every time you attempt to deal with characters in your programs you'll have to understand the difference between byte sequences and Unicode strings."

If you are doing low-level networking or other low-level programming dealing with raw bytes this is true. But for application programming you just put your strings in quotes and they work fine. And if you're in a non-English environment, you still just put your strings in quotes and they still work fine. But in Python 2, for non-English environments you need to add an encoding comment at the top of each file and you may have to use Unicode escapes.

Working with strings in Python 3 is easier than in Python 2 since you always know they are Unicode whereas in Python 2 they can be in any 8-bit encoding depending on the encoding comment, the environment, or where they came from.

And working with raw bytes is easier in Python 3 because of the bytes and bytearray objects which are optimized for use with bytes rather than Python 2's jack of all trades str type.

The article has a section called:

    "Core Libraries Not Updated"

All of Python's core libraries were updated for Python 3, and further updating is an ongoing process. In general, if you have a library that can work with bytes or strings, the library will accept either and return the same type. So, for example, if you use the regex library, re, and give it a bytes object, any matches will be bytes objects, but if you give it string, any matches will be strings.

The article has a section called:

    "Python 3 Is Not Turing Complete"

This would be laughable if it wasn't being said straight. He claims that "Currently you cannot run Python 2 inside the Python 3 virtual machine." and that this 'proves' that Python 3 isn't Turing complete.

It is true that you can't run Python 2 code in a Python 3 interpreter (unless you use six), but that says nothing about whether Python 3 is Turing complete or not. Turing completeness depends on whether a language supports certain computational features, such as branching and unbounded looping, and Python 3 (and Python 2) have all the necessary features.

What he doesn't seem to understand is that Python 3 (or any other Turing complete language), can be used to _write an interepreter_ for any other language. So, a Python 2 interpreter could be written in Python 3, but no one has done so because there's no point when it is far easier to port Python 2 to Python 3, especially since Python 2 support will cease in a few years time.

The article has a section called:

    "Purposefully Crippled 2to3 Translator"

This section is incredibly insulting to the Python developers. The reason that 2to3 is imperfect is because like so many other things, it is fairly easy to get an 80% solution, but incredibly difficult to go much further. In addition, with the creation of the six library, it became possible to write code that was both Python 2 and Python 3 compatible, so people who want both can have it in the same code base without the need for 2to3. And those who don't need Python 2, don't need 2to3 (except maybe once to help with an initial port) or six.

The article has a section called:

    "Statically Typed Strings"

The title is wrong of course because Python uses dynamic typing. But his chief complaint seems to be that you can't mix strings and bytes in Python 3. That's a deliberate design choice that several Python core developers have explained. Essentially they are saying that you can't concatenate a bunch of raw bytes with a string in the same way that you can't add a set to a list -- and this makes perfect sense because raw bytes could be just bytes, or they could be a representation of text in which case by specifying the encoding (i.e., converting them to a string) the concatenation can take place. And this is in keeping with Python's core philosphy of being explicit.

The article has a section called:

    "Too Many Formatting Options"

He's right! The % formatting was kept to help port old code, the new .format() which is far more versatile is a bit verbose, so finally they've settled on f-strings. So, you do need to know that all three exist (e.g., for maintaining code), but you can easily choose the style that you prefer and just use that.

Conclusion

I have taught Python to many people and written books on Python. I started using Python 3 from the first alpha and by the first beta I'd (manually) ported all my own tools and utilities to it. I also develop commercial software, all of which is written in Python 3 which I find far easier to use in part _because_ of the clear text vs. bytes distinction, plus a number of other smaller improvements (unambiguous except blocks) etc. And certainly, I think that Python 3 is much easier to learn than Python 2. The first thing I always had to do when teaching Python 2 was explain why print was different from everything else (i.e., because it was a statement, not a function, and so didn't need parentheses around its arguments), but for Python 3 print() is just like a function you create yourself.

I've been using Python 3 very happily for 8 years now and it seems to get better and better with each new release.



More information about the Python-list mailing list