The state of python and the web - Armin Ronacher (PyGrunn conference)¶

Armin’s a founding member of the pocoo team with projects like jinja2, werkzeug, sphinx and so.

Python 3 is the elephant in the room that nobody’s talking about. There’s a lot of python 2 code and porting is turning out to be harder than expected.

Some recent python developments:

Unladen swallow is “resting”. Development stopped. It was the number one hope to make python faster.

Python 3.2 got released.

Python’s packaging is being worked on a lot.

Pypy turns out to be quite fast nowadays. Really really fast.

What’s pypy? It is python written in python. Well, in “restricted python”, which can be translated to C automatically. It is 3.7 till 40 times faster than regular cpython!!! Things that will work? Django, flask, pyglet, twisted, sqlite, ctypes and so on.

A problem with pypy is that there’s only experimental support for the python C API. And C-level extensions will always be slow. And there is no reference counting, so you need (for instance) to close files yourself.

But, in summary, python 3 is where all the new language development is happening. What does python 3 mean?

Unicode cleanup. All text-like things are either unicode text or a binary blob.

The language is cleaned up a bit.

The cost… there’s some backwards incompatibility.

The good parts about python 3:

Unicode everywhere where it wasn’t possible before, like in exceptions. And the python source code is now also compiled into unicode, so unicode variables are now possible.

Big IO improvements regarding unicode.

A couple of handy new language constructs. For instance extended iterable unpacking like a, b, c* = some_tuple() with c containing the rest of the items.

The under-the-hood implementation was cleaned up a lot.

Various smaller things. Print is now a function. Obscure standard library modules were removed. No more classic classes. Absolute imports are standard now. Etc.

New python 2.6/2.7 features contain features that make it possible to write code that also works on python 3:

Print as a function.

New IO library.

Explicit byte literals to match python 3’s new string/unicode/bytestring handling.

Advanced string formatting. More advanced than the regular "%s items" string formatting. A new syntax that allows you to rearrange items in the string which is often needed for translatable strings.

More things like support for fractions. Abstract base classes (basically “documented ducktyping…”). The multiprocessing package (which works much like the thread library, but fur subprocesses).

Going forward: currently you basically have to choose between beauty or speed.

The beauty of the code (python 3) or the raw performance of pypy.

Pypy itself will stay written in python 2, but the interpreter might someday support python 3.

Library support:

Numeric libraries work great on python 3.

Pypy still lack proper C-api support.

Some predictions:

Most people will write for python 2.7 without worrying about backwards compatibility. And with the intention of supporting pypy.

Python C api libraries will become less common. ctypes could help a lot and is often better. Pure python (with the help of pypy) is also fast.

We will see libraries that support both 2.7 and 3.x.

Python and the web, especially regarding python 3.

There’s a wsgi spec revision for python 3. And there’s some work done on porting implementations to python 3. Right now WSGI itself isn’t something people really want to change anymore: it just works.

Django and jinja could take advantage of pypy’s behaviour for their template compilation. He’s going to work on an implementation that allows django and jinja to use the same code.

How can we make python 3 work on the web?

Port libraries over to 3.x.

Issues with python 3 will only be resolved when people are actively porting and trip over those issues.

Higher level items like Django are easier to port over, the low-level libraries for network connections and so are the really hard nuts to knack.

It is not too hard to port if you can drop python 2.6 support. Good python 2.7 code can generally survive a 2-to-3 conversion just fine.

See http://bit.ly/python3-now for some pointers and tips.

We’re doing great regarding python web in general: