A few days ago, well-known author and developer Zed Shaw wrote a blog post, “ The Case Against Python 3.” I have a huge amount of respect for Zed’s work, and his book ( Learn Python the Hard Way) is one whose approach is similar to mine — so much so, that I often tell people who either are about to take my course to read it in preparation — and that people who want to practice more after finishing my course, should read it afterwards.
It was thus disappointing for me to see Zed’s post about Python 3, with which I disagree.
Let’s make it clear: About 80% of my work is as a Python trainer at various large companies; my classes range from “Python for non-programmers” and “Intro Python” to “Data science and machine learning in Python,” with a corresponding wide range of backgrounds. I would estimate that at least 95% of the people I teach are using Python 2 in their work.
In my own development work, I switch back and forth between Python 2 and 3, depending on whether it’s for a client, for myself, and what I plan to do with it.
So I’m far from a die-hard “Python 3 or bust” person. I recognize that there are reasons to use either 2 or 3. And I do think that if there’s a major issue in the Python world today, it’s in the world of 2 vs. 3.
But there’s a difference between recognizing a problem, and saying that Python 3 is a waste of time — or, as Zed is saying, that it’s a mistake to teach Python 3 to new developers today. Moreover, I think that the reasons he gives aren’t very compelling, either for newcomers to programming in general, or to experienced programmers moving to Python.
Zed’s argument seems to boil down to:
Implementing Unicode in Python 3 has made things harder, and
The fact that you cannot run Python 2 programs in the Python 3 environment, but need to translate them semi-automatically with a combination of 2to3 and manual intervention is crazy and broken.
I think that the first is a bogus argument, and the second is overstating the issues by a lot.
As for Unicode: This was painful. It was going to painful no matter what. Maybe the designers got some things wrong, but on the whole, Unicode works well (I think) in Python 3.
In my experience, 90% of programmers don’t need to think about Unicode, because *so* many programmers use ASCII. For them, Python 3 works just fine, no better (and no worse) than Python 2 on this front.
For people who do need Unicode, Python 3 isn’t perfect, but it’s far, far better than Python 2. And given that some huge proportion of the world doesn’t speak English, the notion that a modern language won’t natively support Unicode strings is just nonsense.
This does mean that code needs to be rewritten, and that people need to think more before using strings that contain Unicode. Yes, those are problems. And Zed points out some issues with the implementation that can be painful for people.
But again, the population that will be affected is the 10% who deal with Unicode. That generally doesn’t include new developers — and if it does, everything is hard for them. So the notion that Unicode problems making Python 3 impossible to use is just silly. And the notion that Python can simply ignore Unicode needs, or treat non-English characters are a second thought, is laughable in the modern world.
The fact that you cannot run Python 2 programs in the Python 3 VM might have been foolish in hindsight. But if the migration from Python 2 to 3 is slow now, imagine what would have happened if companies never needed migrate? Heck, that might still happen come 2020, when large companies don’t migrate. And they won’t. They have too much legacy code, and they aren’t going to move to Python 3.
So yes, that would have been nice to have. It’s not happening. I’m not a langauge designer, and I’m not sure how hard it would have been to allow this. I’m guessing that it would have been hard, though, if only because it would have saved a great deal of pain and angst among Python developers.
But let’s consider who this lack of v2 backward compatibility affects, and what a compatible VM might have meant:
For new developers using Python 3, it doesn’t matter.
For small (and individual) shops that have some software in Python 2 and want to move to 3, this is frustrating, but it’s doable to switch, albeit incrementally. This switch wouldn’t have been necessary if the VM were multi-version capable.
For big shops, they won’t switch no matter what. They are fully invested in Python 3, and it’s going to be very hard to convince them to migrate their code — in 2016, in 2020, and in 2030.
(PS: I sense a business opportunity for consultants who will offer Python 2 maintenance support contracts starting in 2020.)
So the only losers here are legacy developers, who will need to switch in the coming three years. That doesn’t sound so catastrophic to me, especially given how many new developers are learning Python 3, the growing library compatibility with 3, and the fact that 3 increasingly has features that people want. With libraries such as six, making your code run in both 2 and 3 isn’t so terrible; it’s not ideal, but it’s certainly possible.
One particular point strikes me as particularly silly: The lack of Python 3 adoption doesn’t mean that Python 3 is a failure. It means that Python users have entrenched business interests, and would rather stick with something they know than upgrade to something they don’t. This is a natural way to do things, and you see it all the time in the computer industry. (Case in point: Airlines and banks, which run on mainframes with software from the 1970s and 1980s.)
Zed does have some fair points: Strings are more muddled than I’d like (with too many options for formatting, especially in the next release), and some of the core libraries do need to be updated and/or documented better. And maybe some of those error messages you get when mixing Unicode and bytestrings could be improved.
But to say that the entire language is a failure because you get weird results when combining a (Unicode) string and a bytestring using str.format… in my experience, if someone is doing such things, then they’re no longer a newcomer, and know how to deal with some of these issues.
Python 3 isn’t a failure, but it’s not a massive success, either. I believe that the reasons for that are (1) the Python community is too nice, and has allowed people to delay upgrading, and (2) no one ever updates anything unless they have a super-compelling reason to do so and they can’t afford not to. There is a growing number of super-compelling reasons, but many companies are still skeptical of the advantages of upgrading. I know of people who have upgraded to Python 3 for its async capabilities.
Could the Python community have handled the migration better? Undoubtedly. Would it be nice to have more, and better, translation tools? Yes. Is Unicode a bottomless pit of pain, no matter how you slice it, with Python 3’s implementation being a pretty good one, given the necessary trade-offs? Yes.
At the same time, Python 3 is growing in acceptance and usage. Oodles of universities new teach Python 3 as an introductory language, which means that in the coming years, a new generation of developers will graduate and expect/want to use Python 3. People in all sorts of fields are using Python, and many of them are switching to Python 3.
The changes are happening: Slowly, perhaps, but they are happening. And it turns out that Python 3 is just as friendly to newbies as Python 3 was. Which doesn’t mean that it’s wart-free, of course — but as time goes on, the intertia keeping people from upgrading will wane.
I doubt that we’ll ever see everyone in the Python world using Python 3. But to dismiss Python 3 as a grave error, and to say that it’ll never catch on, is far too sweeping, and ignores trends on the ground.