27 May 2014 by Published in: python, rants 10 comments

There has been a slow chorus of poor anti-Python 3 articles lately. Today’s was Python 3 is killing Python. The article is “true” in the sense that it accurately reflects the author’s feelings, but the thesis is fundamentally wrong about the language, the language developers, and the community.

Just for the record, there are some very good criticisms of Python 3 like Armin Ronacher’s. So if you want to read something negative about Python 3 go read that. But the thing about essays like that (and other good criticisms about Python 3) is that they have specific things to say about improving Python 3. They do not take the position that we should throw out the last 5 years of Python development and start over.

By the way, if you are interested in a defense of Python 3 by somebody who is actually qualified to write one you should read Nick Coghlan’s Q&A which is as close as you will get to an official position on why we have Python 3 to begin with and why none of the amateur hour ideas are taken seriously. (Excluding, of course, criticisms like Armin’s, which are not amateur hour at all.) Nick Coghlan’s document should really be a required citation for any article advancing a new course for Python, because nobody is going to take you seriously if you don’t address the arguments that have been considered so far.

The elephant in the room

So some background. The Python project is an open-source project run by an all-volunteer team. Python’s Benevolent Dictator For Life, Guido van Rossum, is not, actually, a full-time Python core developer. He spends a good part of his time writing conflict resolution algorithms for Dropbox. In theory the PSF pays people to work on Python but in practice the total amount spent per year is well under the median salary for 1 software developer.

This means that, in reality, everybody who works on Python does it for fun. There are no customers, and there are no vendors. It’s just people hacking on Python cause they enjoy it.

So in order to argue that Python 3 is bad and development should stop and shift back to Python 2, it is a necessary prerequisite to explain why an all-volunteer army should stop volunteering in the way that they want to volunteer and start volunteering in the way that you want them to volunteer.

There are plenty of ways to convincingly make that argument. One way is to offer to hire the top 10 Python core developers to work on Python 2. Another way is to grab 10 developers around you and contribute to Python 2 yourselves; a group of 10 intelligent, well-funded full-time developers could probably blow past whatever rate of innovation an all-volunteer army can sustain. A third way is to set up an organization that competes with the PSF–that organizes conferences, grants, and hackathons focused around Python 2.

However one argument that definitely does not work is “you should work on Python 2 because that would make my life as a commercial software developer easier”. The fact that Python 2 and commercial software developers had a symbiotic relationship at all was a happy coincidence, never a goal. The goal was “produce a language that Guido van Rossum and the other volunteer developers enjoy.” That goal was achieved with Python 3. The fact that other people’s goals were not achieved is a problem for those people–but it remains to be explained how the hell it becomes Guido’s problem that after a decade of working on Python 2 for free he decided not to anymore.

Python 3 by the numbers

Python 2 apologists make some extraordinary claims. For example:

One of the great strengths of Python 2 is the long tail of 3rd party libraries to do, well, just about anything. Python 3 doesn’t have this.

It is time for this talking point to die. Of the top 200 3rd party libraries, 80% have Python 3 support at the time of this writing. Of the remaining packages, many are things like supervisor and Fabric that are stand-alone applications where nobody cares what version of Python they run. To say that Python 3 “doesn’t have” 3rd party libraries is not just wrong, it’s completely absurd.

The author also claims that nobody uses Python 3 in production:

Choice #2 is obviously not popular, because if it was, we’d have a lot of Python 3 apps in production, and much of the long tail of Python 2 libraries would be ported. Neither of those things is true.

This is equally absurd. For example in March 2014 Python 3 downloads overtook Python 2 downloads by a healthy margin 54% vs 46%. What are all those people doing with Python 3, if not writing production software? Ubuntu just banished Python 2 from their newest LTS release (well, except for the phone OS). Fedora is rolling over to Python 3 next year. Arch did this back in 2010 (which was arguably early, but in fairness to them they like to be up to date). To say that we don’t have a lot of Python 3 apps in production is not just wrong, it’s totally absurd.

Just use it then

I strongly suspect the “nobody uses this” argument is one of those pesky cases of sampling bias. Python 2 developers know other Python 2 developers. Python 3 developers know other Python 3 developers. Right now about 90% of my projects are Python 3. Most of my friends use Python 3. I no longer make any attempt to make my libraries compatible with Python 2 users. I could go an entire work week without even thinking of Python 2. That is how pervasive Python 3 is in my corner of the world.

Is my experience in any way representative? Of course not. But as one person, I don’t particularly care if it is representative or not–it’s representative for me. Python 3 is now good enough for me to do all the things that I do. For all I care adoption can stay exactly where it is. I am under no particular compunction to spread the gospel of Python 3 because I can just use it and be happy in my Python 3 world.

If Python 2 is so great, then just use it! Go to python.org and click the download button. This is not a task that requires you to argue with anyone. You do not need anybody’s permission. There is absolutely no reason to invade a land where people are happy using Python 3 and convince us that we are bad. Just use it!

Steps required to use Python 2.x:  1.  Move mouse right 100px.   There is no step 2.

]10 Steps required to use Python 2.x:
1. Move mouse right 100px.
2. There is no step 2.

The thing is, when the python2ists write pieces like this, they tip their hand. If python2 is great, then there is no reason to convince the dev team to work on it, because it is great already. The only way to even advance the position that resources should be allocated to python2 development is to concede that there is something about it that is unsatisfactory that would justify additional work. And not just “a little bit” unsatisfactory, but so unsatisfactory that it justifies shutting down an entire ecosystem that is working out pretty well for the people currently using it. And kidnapping software engineers who have expressed disdain for Python 2 and forcing them to write code against their will.

Just fork it then

Articles like Alex’s suggest the solution is to fork:

One solution is to fork Python 2.7, and continue developing the language, adding features in a backwards compatible way so large, unportable (due to financial constraints) Python 2 applications can continue to evolve and improve and bring value to the people and companies that invested so much time developing them. This is the correct thing to do (actually, it would be best if Guido and other leaders in the Python community did this officially instead of forcing a fork).

Maybe Alex missed it, but here’s the button:

A python fork

You don’t need permission. You don’t need to argue with anybody. Just do it! It’s not that hard. I’m just some guy on the internet, and I maintain a surprising number of forks of various FOSS projects. I fork more often than once a week.

It’s not even that hard to backport major Python 3 features to Python 2. The work is already done in some cases, like Trollius and six. The fact that nobody has even bothered to take ten minutes to merge Trollius into their Python 2.8 fork is “case closed” level evidence that the demand for Python 2.8 is zero.

Blog posts aren’t demand. Demand is people willing to develop. Demand is people willing to fund development. I’d even settle for a $15 themeforest splash page that lists one corporate sponsor and one developer’s bio. How is it that Python is somehow in grave danger of forking and nobody will even buy a domain name for the fork? People literally do that for a weekend hack project. This is a tempest in a teacup if I’ve ever seen one.

“Not much was gained”

There are a lot of claims in here that are absurdly wrong, but the statement that “nothing much was gained” in Python 3 is a candidate for dumbest statement of the decade. First of all it is wrong because if it were true then it wouldn’t be that hard for people like Alex to press the Fork button and backport all the Python 3 features to Python 2, which nobody does.

But there is an even simpler reason why it is wrong. I present to you, the complete list of changes since Python 2.x:

iOS users click here to continue. No seriously. Click that link. It does play audio. I promise it’s worth it.
python_changes_1 python_changes2 python_changes3 python_changes4 python_changes5 python_changes6 python_changes7 python_changes8 python_changes9 python_changes10 python_changes11 python_changes12

(The audio will stop playing if you scroll down a bit.)


Now if this entire 192-page document is “nothing really amazing” and “you’re not blown away by it” then that is your prerogative. Perhaps you’re simply not a very excitable person. I suggest an ordinary person would probably find something in there amazing.

Nickous Ventouras’s rebuttal to Alex’s post includes such suggestions as “fix long-standing annoyances”, “shake the API” and “improve speed”. I guarantee you, there is page after page after page of that stuff in the changelog. Python 3 doesn’t need more features–it needs a better PR campaign. The features are already there; people just don’t know about them.

But it is wrong statement of the decade to call this set of release notes “not much”. It’s much. The release notes weigh two pounds. I challenge you to find another project where release notes can be measured by the pound. It took me several tries to find one. The one I found was Rails.

Which by the way, is not backwards compatible either

I don’t know much about Rails, but here is a list of compatibility breakages between Rails 4.0 and minor release 4.1. WAT. Oh and they refuse to use semver. And people just deal with it. They even band together to create commercial forks of Rails. As far as I know, Rails is not in a crisis because they break backwards compatibility once a week.

By comparison Python is a paragon of stability. Python 3 has been out for five years. If you can’t lift a finger to port your code in a five-year period then that is your problem. You can’t expect anyone else, least of all a bunch of volunteers, to drop what they are working on and make things easier for you.

In the real world, we break backwards compatibility from time to time. For me the Python community has a long track record of striking the right balance between upgrade windows and introducing cool new features. If it doesn’t strike the right balance for you then go use something else. Volunteers have better things to do than maintain backwards compatibility for five years because you’re lazy.

So what are you going to do about it?

People who use Python 2 today have a set of options available to them:

  1. Upgrade to Python 3.
  2. Do nothing. Keep using Python 2.
  3. Try Ruby (If you’re leaving due to backwards compatibility… it’ll be a short trial)
  4. Try Go or some other language that shares your view on backwards compatibility
  5. Go buy an RHEL license because Red Hat is commercially committed to supporting 2.x for a long ass time
  6. Go buy ActivePython, which will support 2.x as long as people are willing to buy it.
  7. Go run PyPy or Pyston, which, if you’re on 2.7, you probably want to be doing anyway
  8. Fork Python 2.

People can and do have all of these reactions to the Python 3 transition (although not #8, to my knowledge). What is probably not going to solve anything is whining on the internet that other people won’t do something about it for you.

If you are upset about Python 3 go do any one of those. Complaining on the internet solves nothing. You have no leverage.

Python 3 isn’t having the sort of crisis in confidence where a well-placed blog post could crumble the resolve. It is a thriving and vibrant ecosystem where the sort of people who are actually qualified to defend it are having too much fun using it to bother, and so that task falls to people like me.

The not-very-politically-correct-truth is, the Py3 ecosystem is sufficiently large that it doesn’t really matter at this point when or if all the laggards get on board. There was a time when it mattered more, but these days the ecosystem is sufficiently robust that people like me can go for long periods without ever thinking of Python 2. There is probably more that can be done for criticisms like Armin’s, but largely those are “POSIX border disputes” where something small can address the issue.

Not everybody can forget about Python 2 completely right now, but not everybody needs to move to Python 3 at all, or to use any particular programming language for that matter. Go do what makes you happy.

What makes me happy is using Python 3.

Want me to build your app / consult for your company / speak at your event? Good news! I'm an iOS developer for hire.

Like this post? Contribute to the coffee fund so I can write more like it.


  1. ix
    Tue 27th May 2014 at 4:34 am

    I do remember having python2 installed (including libraries) and trying to run python3 stuff next to it, you sometimes run into the strangest of issues and it can be quite frustrating before you figure out how exactly the python3 library picked up on the python2 version of one of its dependencies or vice versa (I’ve forgotten how exactly, but it was extremely annoying when I had to grapple with it once). That’s more likely to happen if you’re on a RHEL derivative, since they all come with ancient python versions. At least the new CentOS will have 2.7, yay.

  2. Tue 27th May 2014 at 11:18 am

    It’s great to hear a voice of reason amongst the recent idiocy.

    I compiled a list of the 10 best features of Python 3 at http://asmeurer.github.io/python3-presentation/slides.html#1. These are specifically features that are not backwards compatible; it is impossible to write Python 2 compliant code that uses them. The problem isn’t that there are no carrots in Python 3. The problem is that no one knows what they are, because no one uses Python 3.

    Regarding using both, I recommend just using Anaconda. The conda package manager makes switching between versions of Python super easy (full disclosure, I work for Continuum on the conda package manager).

    Regarding the forking of Python 2, you are right on. I suspect no one has actually forked Python 2 because anyone who knows enough about CPython to do the fork would know enough to know how much better Python 3 is than Python 2, and would never ever want to see Python 2 again. There’s a reason the core Python devs despise Python 2.

  3. Matt Campbell
    Tue 27th May 2014 at 3:57 pm

    Well said. I’m still on Python 2, but I’ve never been inclined to complain about Python 3.

    Just curious, what kinds of projects do you do with Python 3? Server-side web apps? Desktop GUI apps (if so, with what toolkit)? Something else?

  4. JoeSteel
    Tue 27th May 2014 at 5:13 pm

    I very much agree with your points about Python being a volunteer-driven effort, and that it is not the responsibility of any of the volunteers to conform to external pressures to support Python 2 going forward for commercial vendors.

    However, in your point about Python 3 needing better PR, I think you’re ignoring the commercial vendors that integrate Python. There is no better PR than Python 3 being the interpreter integrated in to software packages instead of Python 2. Commercial graphics software, like Maya, Nuke, Katana, etc. all embed a python 2.7 interpreter. They write API’s against it for scripting software to control features, and handle repetitive tasks. Similar things happen with Lua, and TCL, too. My intro to Python was through these packages. This produces a lot of people interested in working in Python for other tasks. That it becomes more integrated with other tools, and is used in other parts of the pipeline at a facility. It has a top-down effect that spreads from the interpreter being used in the commercial software package. These are not the users that are the most familiar to the python community at large because most things are web centric. I can only assume that other commercial applications of Python have a similar, lingering quality with Python 2.

    Right now, I know enough to run twisted virtual servers for my personal site, write my own static blogging platform, do really tiny, dumb things –but I do them all with Python 2 because that is what’s most familiar to me and what I will encounter in a work environment.

    If the day comes when Maya, Nuke, Katana, etc. start making decisions about picking another scripting language, then will they pick Python 3? I’m not sure. I’d logically stick with what I was using at work.

    I follow Armin’s blog and twitter account closely, and I don’t find it encouraging. I don’t see the friendly PR outreach to people having problems. I do see very cross essays being written about people adopting that I can not relate to. The 192-page jeopardy component is amusing, I’ll grant that for sure, but it does very little to actually advocate why commercial vendors should switch, nor does it provide much incentive for the users of those commercial platforms to pressure the vendors in to switching versions.

    It is an unpleasant task that no one really wants to volunteer for — I certainly would not want to even if I was competent enough. That’s the problem though, Python 3 makes me feel like even more of an outsider than Python 2. I don’t doubt the huge improvements that have been made, but I lack the ability to articulate any of them over Python 2 if someone were to ask me.

    Perhaps it is precisely because this is a programming language by the volunteers, for the volunteers, that I’ll never be able to fully grasp all the of “why” of it. I do laud every one of them for their tireless work, and for the commitment to extend security patches for 2.7.x. I just lament that outreach mostly exists in trading blog post rebottles, or really dense documentation. Like Mulder’s office poster: I want to believe.

  5. erik
    Tue 27th May 2014 at 7:04 pm

    This is the best commentary on the issue that I’ve seen and I’m glad you took the time to write. I also felt well I represented here because I love coding in Python3 and every time Python2 users complain, I just think to myself, “well, okay, I’ll just keep happily coding in Python3 anyway.”

  6. Joal
    Wed 28th May 2014 at 3:25 am

    Absolutely correct. The developers are volunteers and can move the project in whichever way they deem fit.

    This is a fundamental risk of the use of free (as in beer) software. Simply put, if you have specific requirements on some piece of software, particularly if it is mission-critical software, then you need to pay someone to fulfil them, rather than vaguely hope that the whims and dreams of volunteer developers will happen to align with yours.

  7. Guido Van Asshole
    Wed 28th May 2014 at 5:01 am

    Stackless has 2.8, they just don’t call it that for political reasons.

  8. Terry Jan Reedy
    Wed 28th May 2014 at 8:46 pm

    I am one of the volunteer core developers, working mostly but not exclusively on Idle. Thank you for the best post I have seen on Python 3 by a non-developer. It made my day ;-).

  9. Fran
    Thu 29th May 2014 at 4:15 pm

    I started writing python because that was the server language of choice at a prior job. The CTO had strong opinions about using 2.x so that’s what I learned. Since then I’ve moved on from that job, and although I don’t have any bias against python 3, I just keep finding 2 installed on all the machines I encounter, so I just use that. So the employer motivation to switch isn’t there, and getting ops guys to install new packages in their finely tuned systems is not trivial, so it is easy to just stay where I am unless and until I need to move.

    As part of personal development I’d love to try using python 3, but I have no idea where to start, and showing a massive document like the one you embedded is no inspiration (and I assume that wasn’t your goal, either). I’ve encountered someone with a strong python 2 bias, and I have paid no attention to whatever struggle is going on, but I’d hoped for some positive notions about why I should switch and thus deal with whatever hassles that such a change requires. I’ve done a bit of browsing over the years on the topic, but most of the writing seems to be focused on the conflict and not on moving people like me to switch, so it would be nice to find some links to good articles or books on switching to 3.

Comments are closed.

Powered by WordPress