9293
Comment: Mention the option of finding alternate packages that support 3.x
|
13874
wiki restore 2013-01-23
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
Line 2: | Line 3: |
Line 5: | Line 7: |
''Short version: Python 2.x is the status quo, Python 3.x is the shiny new thing.'' | |
Line 7: | Line 8: |
At the time of writing (21 Jun 2010), both are still under development. There's one more 2.x release (2.7) still to come, but the 2.x branch is unlikely to see any new major releases after that (although there will continue to be bug fix releases for a number of years). 3.x is under active and continued development, with 3.1 already available and 3.2 due for release later this year. | ''Short version: Python 2.x is the status quo, Python 3.x is the present and future of the language'' |
Line 9: | Line 10: |
3.x is the newest branch of Python and the intended future of the language. Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. This allowed several aspects of the core language (such as print and exec being statements, integers using floor division) to be adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language. It also allowed later language features (such as iterators) to be applied to older language features (such as the range() builtin which returns a list in 2.x, but an iterator in 3.x) | |
Line 11: | Line 11: |
The [[http://docs.python.org/release/3.0.1/whatsnew/3.0.html|What's New in Python 3.0]] document provides a good overview of the major language changes and likely sources of incompatibility with existing Python 2.x code. | At the time of writing (July 4, 2010), the final 2.7 release is out, with a statement of extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is under active development and has already seen stable releases, such as the recent 3.2. This means that all recent standard library improvements, for example, are only available in Python 3.x. |
Line 13: | Line 13: |
However, the broader Python ecosystem has amassed a significant amount of quality software over the years. The downside of breaking backwards compatibility in 3.x is that a lot of that software doesn't yet work on 3.x. | |
Line 15: | Line 14: |
== So which version should I use? == | Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. The most drastic improvement is the better Unicode support (with all text strings being Unicode by default) as well as saner bytes/Unicode separation. |
Line 17: | Line 16: |
Which version you ought to use is mostly dependant on what you want to get done. | |
Line 19: | Line 17: |
If you can do exactly what you want with Python 3.x, great! There's a few downsides, such as comparatively limited library support and the fact that current Linux distributions and Macs are still shipping with 2.x by default, but as a language Python 3.x is definitely ready. As long as actually getting Python 3.x on your user's computers (which ought to be easy since a lot of people reading this may only be developing something for themselves or an environment they control) and you're writing things where lack of third party software isn't a major impediment (or where you know the packages you need already support Python 3), Python 3.x is an excellent choice. | Besides, several aspects of the core language (such as print and exec being statements, integers using floor division) have been adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language, and old cruft has been removed (for example, all classes are now new-style, "range()" returns a memory efficient iterable, not a list as in 2.x). The [[http://docs.python.org/py3k/whatsnew/3.0.html|What's New in Python 3.0]] document provides a good overview of the major language changes and likely sources of incompatibility with existing Python 2.x code. However, the broader Python ecosystem has amassed a significant amount of quality software over the years. The downside of breaking backwards compatibility in 3.x is that much of that software doesn't work on 3.x yet. == Which version should I use? == Which version you ought to use is mostly dependent on what you want to get done. If you can do exactly what you want with Python 3.x, great! There's a few downsides, such as comparatively limited library support and the fact that most current Linux distributions and Macs are still using 2.x as default, but as a language Python 3.x is definitely ready. As long as actually getting Python 3.x on your user's computers (which ought to be easy, since many people reading this may only be developing something for themselves or an environment they control) and you're writing things where lack of third-party software isn't a major impediment (or where you know the packages you need already support Python 3), Python 3.x is an excellent choice. Also, several distributions have Python 3.x already installed or available for end-users. |
Line 23: | Line 37: |
Firstly, if you're deploying to an environment you don't control, that may impose a specific version rather than allowing you a free selection from the available versions. | Firstly, if you're deploying to an environment you don't control, that may impose a specific version, rather than allowing you a free selection from the available versions. |
Line 27: | Line 43: |
Popular modules that don't yet support Python 3 include Twisted (for networking and a bunch of other stuff), gevent (like Twisted but different), Django (for building websites), PyGTK (for making GUIs), py2exe (for packaging your application for Windows users), PIL (for processing images), numpy (for number crunching)... | |
Line 29: | Line 44: |
Most of these libraries have people working on 3.x support and it's mostly a work in progress in various stages of completion. numpy, for example, is pretty close to completion. For some libraries, it's more of a priority than others: Twisted, for example, is mostly focused on production servers, where people haven't even upgraded to Python 2.5, let alone thought about using 3.x. | Popular modules that don't yet support Python 3 include [[http://twistedmatrix.com/trac/wiki|Twisted]] (for networking and other applications), [[http://code.google.com/p/gevent/|gevent]] (like Twisted, but different), [[https://docs.djangoproject.com/en/dev/faq/install/#can-i-use-django-with-python-3|Django]] (for building Web sites), and [[http://www.pythonware.com/products/pil/|PIL]] (for processing images). |
Line 31: | Line 46: |
Not only that, but there may be alternative packages that provide comparable functionality that are already available for Python 3 (e.g. using Tkinter or PyQt for GUI functionality). | |
Line 33: | Line 47: |
Another issue with choosing Python 3 is that a lot of documentation (including examples) on the web and in reference books will be for Python 2. This can require some adjustment to make things work with Python 3 instead. | Most of these libraries have people working on 3.x support and it's mostly a work in progress in various stages of completion. For some libraries, it's more of a priority than others: Twisted, for example, is mostly focused on production servers, where supporting older versions of Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is a prime example of a major package where [[http://twistedmatrix.com/trac/milestone/Python-3.x|porting to 3.x is far from trivial]].) |
Line 35: | Line 49: |
== But wouldn't I want to avoid 2.x? It's an old language with a bunch of mistakes, and it took a major version to get 'em out. == | |
Line 37: | Line 50: |
Well, not really. The good news is that you don't have to drop all of the 3.x goodness because you're using 2.x. A lot of the good ideas in 3.0 were backported to 2.6, and even more of the good ideas from 3.0, 3.1 and the upcoming 3.2 will be available in 2.7. The number of things that you really can't do in 2.x but can in 3.x is pretty small: it's just not always as elegant as it is in 3.x. (Now, if you want things like function annotations, syntax for keyword-only arguments, extended tuple unpacking, non-local variable declarations and the like for your own benefit then 3.x is your only option). For more details on the backported features, see the [[http://docs.python.org/release/2.6.4/whatsnew/2.6.html|What's New in Python 2.6]] and [[http://docs.python.org/dev/whatsnew/2.7.html|What's New in Python 2.7]] | For creating GUI applications Python 3 already comes with Tkinter, and has been supported by [[PyQt4|PyQt4]] almost from the day Python 3 was released; [[PySide|PySide]] added Python 3 support in 2011. GTK+ GUIs can be created with [[https://live.gnome.org/PyGObject|PyGObject]] which supports Python 3 and is the successor to [[PyGtk|PyGtk]]. |
Line 39: | Line 52: |
Well written 2.x code will actually be a lot like 3.x code. That can mean a lot of things, including using new-style classes, not using ancient deprecated arcane incantations of print, using lazy iterators where available... | |
Line 41: | Line 53: |
Above all, it is recommended that you focus on writing ''good'' code so that 2.x vs 3.x becomes less of an issue. That includes writing full unit test suites, and getting Unicode right (Python 3.x is significantly less forgiving than 2.x about Unicode versus bytes issues: this is generally considered to be a very good thing since the forgiving nature of 2.x makes for some awfully buggy Unicode handling in libraries and applications; it just makes porting software that doesn't make the distinction very well annoying). | Many other major packages have been ported to Python 3, including numpy (for number crunching), [[CherryPy|CherryPy]] and Pyramid (for Web sites) and cx_Freeze (for packaging applications with their dependencies). Other major modules have now been ported. Some notable which were previously listed on this page as incompatible, have recently been ported to Python 3 are: * [[http://www.pylonsproject.org|Pylons]]' Pyramid now supports Python, including the latest version 3.2. * [[http://www.py2exe.org/index.cgi/Tutorial#Step52|py2exe]] (for packaging your application for Windows users) If you want to use Python 3.x, but you're afraid to because of a dependency, it's probably worthwhile doing some research first. This is a work in progress and this wiki page might be outdated. Even if the [[http://docs.python.org/py3k/|official python documentation]] and the [[http://docs.python.org/py3k/tutorial/|tutorial]] have been updated for Python 3, there is still a lot of documentation (including examples) on the Web and in reference books that still use Python 2. This can require some adjustment to make things work with Python 3 instead. It is worth noting that if you wish to use an alternative implementation of Python such as [[IronPython|IronPython]], [[Jython|Jython]] or [[http://pypy.org|PyPy]] (or one of the longer list of Python platform or compiler [[PythonImplementations|implementations]]), Python 3 support is still relatively rare. This may affect you if you are interested in choosing such an implementation for reasons of integration with other systems or for performance. See the [[Python3PortingStatus|Python 3 Porting Status]] page for information about which libraries have been, or are in the process of being, ported to Python 3. == But wouldn't I want to avoid 2.x? It's an old language with many mistakes, and it took a major version to get them out. == Well, not entirely. Some of the less disruptive improvements in 3.0 and 3.1 have been backported to 2.6 and 2.7, respectively. For more details on the backported features, see [[http://docs.python.org/release/2.6.4/whatsnew/2.6.html|What's New in Python 2.6]] and [[http://docs.python.org/dev/whatsnew/2.7.html|What's New in Python 2.7]]. A non-exhaustive list of features which are only available in 3.x releases and won't be backported to the 2.x series: * strings are Unicode by default * clean Unicode/bytes separation * exception chaining * function annotations * syntax for keyword-only arguments * extended tuple unpacking * non-local variable declarations Also, language evolution is not limited to core syntactic or semantic changes. It also regards the standard library, where many improvements are done in 3.x that will not be backported to Python 2. See [[http://docs.python.org/py3k/whatsnew/3.2.html|What's New in Python 3.2]], for example. That said, well-written 2.x code can be a lot like 3.x code. That can mean many things, including using new-style classes, not using ancient deprecated arcane incantations of print, using lazy iterators where available, etc. A practical example: good 2.x code will typically use xrange instead of range; xrange was the starting point for the Python 3.x range implementation (although range is even better in Python 3, since it can handle values larger than sys.maxint). Above all, it is recommended that you focus on writing ''good'' code so that 2.x vs 3.x becomes less of an issue. That includes writing full unit test suites, and getting Unicode right. (Python 3.x is significantly less forgiving than 2.x about Unicode versus bytes issues: This is considered to be a good thing, though it makes porting some software packages fairly annoying.) |
Line 45: | Line 104: |
Depending on how significant a feature is tied to the third party library, dropping the feature may be a viable option. If the library is genuinely trivial, it may also be possible to roll your own. Be very, very careful with the latter idea though - tasks that appear trivial at first glance may turn out to have lots of tricky corner cases to deal with. Reinventing the wheel in this fashion can mean having to discover all those fun errors yourself, and your project will likely be the worse for it. | |
Line 47: | Line 105: |
Anyway, you don't have to use Python 2.x. You could also make the Python 3.x vs 2.x situation better by porting an existing library and making future users happy. Porting isn't always easy, but it's usually easier than writing your own thing from scratch. Existing project members will usually appreciate the help, especially as porting often finds bugs in the original software, improving the quality of both the original and the 3.x port. | Assuming you can't find an alternative package that already supports Python 3, you still have a few options to consider: |
Line 49: | Line 107: |
How you're supposed to do porting is explained in PEP 3000: http://www.python.org/dev/peps/pep-3000/#id9. The basic idea is to take the 2.x version of the library and use the automated 2to3 converter to create a Python 3 compatible version and check that all the unit tests still pass. If tests fail, modify the original 2.x sources and try again. This approach makes it feasible to support 2.x and 3.x in parallel from a single 2.x code base. This is much easier than trying to maintain separate 2.x and 3.x branches in parallel (just ask the core Python developers about that one - they've been stuck with doing that for a couple of years now!). | |
Line 51: | Line 108: |
The porting situation is more complicated if there are C extension modules involved, but even then it is still likely to be easier than writing an equivalent package from scratch. | * Port the library to 3.x. ("Porting" means that you make the library work on 3.x.) * It is possible that the library isn't really needed and you can use another one. * If that turns out to be really hard, and all your other dependencies do exist in 2.x, consider starting off in 2.x. As has already been explained in other places, good 2.x code will typically make switching painless as soon as every dependency has been successfully ported. * Decide if the feature is really that important. Maybe you could drop it? |
Line 53: | Line 113: |
There are also some more in depth guides right here on the wiki: PortingPythonToPy3k, PortingExtensionModulesToPy3k | The ideal situation is that you try to port the library to 3.x. Often you'll find someone is already working on this. Even when that's not the case, existing project members will usually appreciate the help, especially as porting often finds bugs in the original software, improving the quality of both the original and the 3.x port. Porting isn't always easy, but it's usually easier than writing your own thing from scratch. How you're supposed to do porting is explained in [[http://www.python.org/dev/peps/pep-3000/#id9|PEP 3000]]. The basic idea is to take the 2.x version of the library and use the automated 2to3 converter to create a Python 3 compatible version and check that all the unit tests still pass. If tests fail, modify the original 2.x sources and try again. This approach makes it feasible to support 2.x and 3.x in parallel from a single 2.x code base. This is much easier than trying to maintain separate 2.x and 3.x branches in parallel (just ask the core Python developers about that one - they've been stuck with doing that for a couple of years now!). The porting situation is more complicated if there are C extension modules involved, but even then it is still likely to be easier than inventing your own equivalent package. There are also some more in depth guides right here on the wiki: [[PortingPythonToPy3k|PortingPythonToPy3k]], [[PortingExtensionModulesToPy3k|PortingExtensionModulesToPy3k]] |
Line 57: | Line 128: |
In addition to the 2to3 tool which allows 3.x code to be generated from 2.x source code, there's also the 3to2 tool, which aims to convert 3.x code back to 2.x code. In theory, this should work even better than going the other direction, since 3.x doesn't have as many nasty corner cases for the converter to handle (getting rid of as many of those as possible was one of the main reasons for breaking backward compatibility after all!). However, code which makes heavy use of 3.x only features (such as function annotations or extended tuple unpacking) is unlikely to be converted successfully. | In addition to the 2to3 tool that allows 3.x code to be generated from 2.x source code, there's also the [[3to2|3to2]] tool, which aims to convert 3.x code back to 2.x code. In theory, this should work even better than going the other direction, since 3.x doesn't have as many nasty corner cases for the converter to handle (getting rid of as many of those as possible was one of the main reasons for breaking backward compatibility after all!). However, code which makes heavy use of 3.x only features (such as function annotations or extended tuple unpacking) is unlikely to be converted successfully. It's probably also fair to say that 3to2 is the road less traveled compared to 2to3 at this stage, so you might come across a few rough edges here and there. However, if you want to write 3.x code, it's definitely an idea worth exploring. [[http://packages.python.org/six/|six]] is another tool. |
Line 61: | Line 140: |
. Advice from the #python crew (the original inspiration for the contents of this page): http://python-commandments.org/python3.html . Nick Effort has some specific comments in relation to teaching programming with Python 3: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html . Mark Pilgrim has written a Python 3 focused version of Dive Into Python: http://diveintopython3.org/whats-new.html . "What an IronPython user should know about Python 3": http://www.itworld.com/development/104506/python-3-and-ironpython |
* [[http://getpython3.com/|Community Web site to promote Python 3]] * Nick Efford has some specific comments in relation to teaching programming with Python 3: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html * Mark Pilgrim has written a Python 3 focused version of "Dive Into Python": http://getpython3.com/diveintopython3/ * Swaroop C H has updated "A Byte of Python" to use Python 3, while keeping the last Python 2 based version available: http://www.swaroopch.com/notes/Python * "What an [[IronPython|IronPython]] user should know about Python 3": http://www.itworld.com/development/104506/python-3-and-ironpython * PyCon Ireland 2010 included a talk by Paul Barry entitled "Head First into Python 3" and is available here: http://vimeo.com/groups/pyconireland/videos/14354395 - Paul has a follow-up talk from [[PyCon|PyCon]] Ireland 2011 entitled "What's the scoop with Python 3?" where he talks more about the (lack of) Python 3 adoption within the community, available here: http://vimeo.com/groups/pyconireland/videos/31071871 * Mark Summerfield has written a 4 page PDF summarizing the differences between Python 2 and 3: [[http://ptgmedia.pearsoncmg.com/imprint_downloads/informit/promotions/python/python2python3.pdf|Moving from Python 2 to Python 3]] * Wesley Chun has written a couple of Python 3 articles: [[http://www.informit.com/articles/article.aspx?p=1328795|Python 3: the Evolution of a Programming Language (Mar 2009)]] and [[http://www.informit.com/articles/article.aspx?p=1439189|Python's "New" Division: Python 2 Versus Python 3 (Jan 2010)]] * Wesley Chun's [[http://us.pycon.org/2010/conference/schedule/event/29|Python 3: the Next Generation]] talk & slides ([[PyCon|PyCon]], Feb 2010) * James Bennett wrote an interesting article discussing [[http://www.b-list.org/weblog/2008/dec/05/python-3000/|why Python 3.0 exists at all]] * [[http://washort.twistedmatrix.com/2010/11/unicode-in-python-and-how-to-prevent-it.html|how to get Unicode versus bytes semantics in 2.x similar to the ones in 3.x]] (preventing implicit encoding and decoding, while keeping useful features, such as str.split/bytes.split == Footnotes == |
Should I use Python 2 or Python 3 for my development activity?
What are the differences?
Short version: Python 2.x is the status quo, Python 3.x is the present and future of the language
At the time of writing (July 4, 2010), the final 2.7 release is out, with a statement of extended support for this end-of-life release. The 2.x branch will see no new major releases after that. 3.x is under active development and has already seen stable releases, such as the recent 3.2. This means that all recent standard library improvements, for example, are only available in Python 3.x.
Guido van Rossum (the original creator of the Python language) decided to clean up Python 2.x properly, with less regard for backwards compatibility than is the case for new releases in the 2.x range. The most drastic improvement is the better Unicode support (with all text strings being Unicode by default) as well as saner bytes/Unicode separation.
Besides, several aspects of the core language (such as print and exec being statements, integers using floor division) have been adjusted to be easier for newcomers to learn and to be more consistent with the rest of the language, and old cruft has been removed (for example, all classes are now new-style, "range()" returns a memory efficient iterable, not a list as in 2.x).
The What's New in Python 3.0 document provides a good overview of the major language changes and likely sources of incompatibility with existing Python 2.x code.
However, the broader Python ecosystem has amassed a significant amount of quality software over the years. The downside of breaking backwards compatibility in 3.x is that much of that software doesn't work on 3.x yet.
Which version should I use?
Which version you ought to use is mostly dependent on what you want to get done.
If you can do exactly what you want with Python 3.x, great! There's a few downsides, such as comparatively limited library support and the fact that most current Linux distributions and Macs are still using 2.x as default, but as a language Python 3.x is definitely ready. As long as actually getting Python 3.x on your user's computers (which ought to be easy, since many people reading this may only be developing something for themselves or an environment they control) and you're writing things where lack of third-party software isn't a major impediment (or where you know the packages you need already support Python 3), Python 3.x is an excellent choice. Also, several distributions have Python 3.x already installed or available for end-users.
However, there are some key issues that may require you to use Python 2 rather than Python 3.
Firstly, if you're deploying to an environment you don't control, that may impose a specific version, rather than allowing you a free selection from the available versions.
Secondly, if you want to use a specific third party package or utility that doesn't yet have a released version that is compatible with Python 3, and porting that package is a non-trivial task, you may choose to use Python 2 in order to retain access to that package.
Popular modules that don't yet support Python 3 include Twisted (for networking and other applications), gevent (like Twisted, but different), Django (for building Web sites), and PIL (for processing images).
Most of these libraries have people working on 3.x support and it's mostly a work in progress in various stages of completion. For some libraries, it's more of a priority than others: Twisted, for example, is mostly focused on production servers, where supporting older versions of Python is important, let alone supporting a new version that includes major changes to the language. (Twisted is a prime example of a major package where porting to 3.x is far from trivial.)
For creating GUI applications Python 3 already comes with Tkinter, and has been supported by PyQt4 almost from the day Python 3 was released; PySide added Python 3 support in 2011. GTK+ GUIs can be created with PyGObject which supports Python 3 and is the successor to PyGtk.
Many other major packages have been ported to Python 3, including numpy (for number crunching), CherryPy and Pyramid (for Web sites) and cx_Freeze (for packaging applications with their dependencies).
Other major modules have now been ported. Some notable which were previously listed on this page as incompatible, have recently been ported to Python 3 are:
Pylons' Pyramid now supports Python, including the latest version 3.2.
py2exe (for packaging your application for Windows users)
If you want to use Python 3.x, but you're afraid to because of a dependency, it's probably worthwhile doing some research first. This is a work in progress and this wiki page might be outdated.
Even if the official python documentation and the tutorial have been updated for Python 3, there is still a lot of documentation (including examples) on the Web and in reference books that still use Python 2. This can require some adjustment to make things work with Python 3 instead.
It is worth noting that if you wish to use an alternative implementation of Python such as IronPython, Jython or PyPy (or one of the longer list of Python platform or compiler implementations), Python 3 support is still relatively rare. This may affect you if you are interested in choosing such an implementation for reasons of integration with other systems or for performance.
See the Python 3 Porting Status page for information about which libraries have been, or are in the process of being, ported to Python 3.
But wouldn't I want to avoid 2.x? It's an old language with many mistakes, and it took a major version to get them out.
Well, not entirely. Some of the less disruptive improvements in 3.0 and 3.1 have been backported to 2.6 and 2.7, respectively. For more details on the backported features, see What's New in Python 2.6 and What's New in Python 2.7.
A non-exhaustive list of features which are only available in 3.x releases and won't be backported to the 2.x series:
- strings are Unicode by default
- clean Unicode/bytes separation
- exception chaining
- function annotations
- syntax for keyword-only arguments
- extended tuple unpacking
- non-local variable declarations
Also, language evolution is not limited to core syntactic or semantic changes. It also regards the standard library, where many improvements are done in 3.x that will not be backported to Python 2. See What's New in Python 3.2, for example.
That said, well-written 2.x code can be a lot like 3.x code. That can mean many things, including using new-style classes, not using ancient deprecated arcane incantations of print, using lazy iterators where available, etc. A practical example: good 2.x code will typically use xrange instead of range; xrange was the starting point for the Python 3.x range implementation (although range is even better in Python 3, since it can handle values larger than sys.maxint).
Above all, it is recommended that you focus on writing good code so that 2.x vs 3.x becomes less of an issue. That includes writing full unit test suites, and getting Unicode right. (Python 3.x is significantly less forgiving than 2.x about Unicode versus bytes issues: This is considered to be a good thing, though it makes porting some software packages fairly annoying.)
I want to use Python 3, but there's this tiny library I want to use that's Python 2.x only. Do I really have to revert to using Python 2 or give up on using that library?
Assuming you can't find an alternative package that already supports Python 3, you still have a few options to consider:
- Port the library to 3.x. ("Porting" means that you make the library work on 3.x.)
- It is possible that the library isn't really needed and you can use another one.
- If that turns out to be really hard, and all your other dependencies do exist in 2.x, consider starting off in 2.x. As has already been explained in other places, good 2.x code will typically make switching painless as soon as every dependency has been successfully ported.
- Decide if the feature is really that important. Maybe you could drop it?
The ideal situation is that you try to port the library to 3.x. Often you'll find someone is already working on this. Even when that's not the case, existing project members will usually appreciate the help, especially as porting often finds bugs in the original software, improving the quality of both the original and the 3.x port. Porting isn't always easy, but it's usually easier than writing your own thing from scratch.
How you're supposed to do porting is explained in PEP 3000. The basic idea is to take the 2.x version of the library and use the automated 2to3 converter to create a Python 3 compatible version and check that all the unit tests still pass. If tests fail, modify the original 2.x sources and try again. This approach makes it feasible to support 2.x and 3.x in parallel from a single 2.x code base. This is much easier than trying to maintain separate 2.x and 3.x branches in parallel (just ask the core Python developers about that one - they've been stuck with doing that for a couple of years now!).
The porting situation is more complicated if there are C extension modules involved, but even then it is still likely to be easier than inventing your own equivalent package.
There are also some more in depth guides right here on the wiki: PortingPythonToPy3k, PortingExtensionModulesToPy3k
I decided to write something in 3.x but now someone wants to use it who only has 2.x. What do I do?
In addition to the 2to3 tool that allows 3.x code to be generated from 2.x source code, there's also the 3to2 tool, which aims to convert 3.x code back to 2.x code. In theory, this should work even better than going the other direction, since 3.x doesn't have as many nasty corner cases for the converter to handle (getting rid of as many of those as possible was one of the main reasons for breaking backward compatibility after all!). However, code which makes heavy use of 3.x only features (such as function annotations or extended tuple unpacking) is unlikely to be converted successfully.
It's probably also fair to say that 3to2 is the road less traveled compared to 2to3 at this stage, so you might come across a few rough edges here and there. However, if you want to write 3.x code, it's definitely an idea worth exploring.
six is another tool.
Other resources that may help make the choice between Python 2 and Python 3
Nick Efford has some specific comments in relation to teaching programming with Python 3: http://www.comp.leeds.ac.uk/nde/papers/teachpy3.html
Mark Pilgrim has written a Python 3 focused version of "Dive Into Python": http://getpython3.com/diveintopython3/
Swaroop C H has updated "A Byte of Python" to use Python 3, while keeping the last Python 2 based version available: http://www.swaroopch.com/notes/Python
"What an IronPython user should know about Python 3": http://www.itworld.com/development/104506/python-3-and-ironpython
PyCon Ireland 2010 included a talk by Paul Barry entitled "Head First into Python 3" and is available here: http://vimeo.com/groups/pyconireland/videos/14354395 - Paul has a follow-up talk from PyCon Ireland 2011 entitled "What's the scoop with Python 3?" where he talks more about the (lack of) Python 3 adoption within the community, available here: http://vimeo.com/groups/pyconireland/videos/31071871
Mark Summerfield has written a 4 page PDF summarizing the differences between Python 2 and 3: Moving from Python 2 to Python 3
Wesley Chun has written a couple of Python 3 articles: Python 3: the Evolution of a Programming Language (Mar 2009) and Python's "New" Division: Python 2 Versus Python 3 (Jan 2010)
Wesley Chun's Python 3: the Next Generation talk & slides (PyCon, Feb 2010)
James Bennett wrote an interesting article discussing why Python 3.0 exists at all
how to get Unicode versus bytes semantics in 2.x similar to the ones in 3.x (preventing implicit encoding and decoding, while keeping useful features, such as str.split/bytes.split