Greetings to all!

A few nights ago, I decided to attempt the py2to3 recipe that David describes below, on evoque. Apart from an earlier snag to get py3 installed properly on os x (bug in py3), once started with porting the code base to run on both py2 and py3... it was pretty plain sailing, I ended up finishing it in one sitting. Finishing it to the point where the unit tests run on all of py2.4 thru to py3.0, minus the tests that depend on 3rd party modules not yet available for py3 (e.g. markdown).

The code changes are almost minimal, and less than I would have expected. And, in the end the runtime package gained literally less than a handful of lines of code (on a total that is a little under 1K lines of code). The updated release should be forthcoming shortly...

For me it boiled down to mostly just putting this one block in one of the modules:

+if sys.version < '3':
+    unistr, string = unicode, basestring
+    from cStringIO import StringIO
+else:
+    unistr, string = str, str
+    from io import StringIO

and then, to avoid repetition, import what is needed by other from it, e.g.

+from evoque.evaluator import StringIO

One thing, not mentioned explicitly in David's recipe, is not being able to find a common way to express relative imports... as the syntax in py3 for that is:

from . import submod
from .. import mod
from ..mod import submod

I ended up using absolute imports everywhere, e.g.:

-from template import Template
+from evoque.template import Template

This is a little annoying, as it forces a possibly inappropriate change, but it seems to not cause any problems anywhere.

There may still be some lurking issues when running evoque on py3 that may show up when migrating more specific applications, but I would be surprised if they'd prove to be non-trivial to resolve.

mario


On Dec 5, 2008, at 9:03 PM, Binger David wrote:

The new releases of our packages work with Python 2 *and* with Python 3.0. The Py3k team has a recommended migration strategy involving the use of their
2to3 conversion package and then maintaining separate releases for the
two different flavors of Python. The prospect of maintaining different
branches was unattractive, so we decided instead to try adjusting
our code so that it would work with both Pythons.  As others face
this problem, perhaps it is worth describing our experience.

First we just tried running our code with py3k and noticed right away
that our old code did not fit py3k's syntax. We adjusted the code as required to use rely exclusively on the syntax that is common to Python 2 and Python 3.
That meant that we could not use all of the sweetest constructs, but
we were willing to pay that price. It didn't take too long to get all of the
code converted so that it would at least compile with Py3k.

Once that was done, we went on to hammer our way through unit tests and make changes as necessary to make them work. In some cases where modules in the standard library have changed names, we use 'if sys.version < "3":' blocks to get the right imports for each version. We searched out calls
of zip(), filter(), and map() and wrapped them in list().  We removed
u'blah' syntax and used as_unicode('blah') instead, where as_unicode()
is defined differently for different versions. We added __bool__ = __nonzero__ to our classes that define __nonzero__. We got rid of __cmp__() and added
rich comparisons where it was needed.  We fixed the arguments in our
calls to the sort() method.  After a period of making
transformations of this type, the unit tests passed and we were able
to do more testing by running QP's demo applications and our own applications
in py3k, and this exposed some more issues that our unit tests did not
catch, but we dealt with them using the same methods of correction.

Now our entire code base, public and private, runs in Python 2 and Python 3. We're in no hurry about it, but when we do decide to migrate our production systems to Python 3, we think it will be like jumping a creek, not the Snake
River Gorge.

_______________________________________________
QP mailing list
[email protected]
http://mail.mems-exchange.org/mailman/listinfo/qp

Reply via email to