[Python-Dev] PEP 414 (original) (raw)

Vinay Sajip vinay_sajip at yahoo.co.uk
Sat Mar 3 11:39:45 CET 2012


Lennart Regebro <regebro gmail.com> writes:

I'm not sure that's true at all. In most cases where you support both Python 2 and Python 3, most strings will be "native", ie, without prefix in either Python 2 or Python 3. The native case is the most common case.

Sorry, I didn't make myself clear. If you import unicode_literals, then in both 2.x and 3.x code, an unadorned literal string is text, and a b-adorned literal string is bytes. My assertion was based on that assumption - the text (Unicode) case then becomes the most common case.

> In terms of practicality, it is > IMO quite practical (assuming 2.5 / earlier support can be dropped) to > move to a > 2.6+/3.x-friendly codebase, e.g. by using Armin's python-modernize.

I think there is some misunderstanding here. The binary/unicode/native separation is only possible on Python 2.6 and 2.7 at the moment, unless you use function wrappers like b().

Right, and that is a possible option for 2.5 and earlier: though obviously not a desirable one from an aesthetic point of view!

What I meant (and should have said) was: if you can drop support for 2.5 / earlier, a lib2to3 fixer-based approach brings your 2.x code into the 3-friendly region of 2.x - 2.6 and 2.7. You can then, using the unicode_literals approach, arrive at a common codebase for 2.6+ and 3.x which is not slow to run (see my other post on ported Django test run performance), and clean (looks just like 3 code, pretty much, and means the same, as far as string literals are concerned). Where you hit native string requirements, apply the wrapper.

I don't actually use python-modernize, as I independently developed fixers when doing the Django port late last year. I initially wrote a fixer to transform u'xxx' to u('xxx') (as I was assuming 2.5 support was needed), and then, when it appeared likely that Django would drop 2.5 support after 1.4, I wrote a fixer to go from u('xxx') to 'xxx'. Once I learned to use lib2to3, with a few pointers from Benjamin, it worked like a charm for me.

Regards,

Vinay Sajip



More information about the Python-Dev mailing list