Standard Library Reorganization

The standard library has been reorganized for Python 3.

Renamed Modules

  • Fixer: python-modernize -wnf libmodernize.fixes.fix_imports_six
  • Prevalence: Common

Many modules were simply renamed, usually to unify file naming conventions (e.g. ConfigParser to configparser) or to consolidate related modules in a namespace (e.g. tkFont to tkinter.font).

The Compatibility library: six library includes six.moves, a pseudo-package that exposes moved modules under names that work in both Python 2 and 3. For example, instead of:

from ConfigParser import ConfigParser

you should import from six.moves:

from six.moves.configparser import ConfigParser

A list of all renamed modules is included in six documentation.

The recommended fixer will automatically change imports to use six.moves.

Removed modules

  • Fixer: None
  • Prevalence: Uncommon

Some modules have been removed entirely. Usually, these modules were supplanted by better alternatives (e.g. mimetools by email), specific to now-unsupported operating systems (e.g. fl), or known to be broken (e.g. Bastion).

Lennart Regebro compiled a list of these modules in the book “Supporting Python 3”, which is available online.

If your code uses any of the removed modules, check the Python 2 documentation of the specific module for recommended replacements.

The urllib modules

  • Fixer: None
  • Prevalence: Common

The urllib, urllib2 and urlparse modules were reorganized more heavily, with individual functions and classes redistributed to submodules of Python 3’s urllib: urllib.parse, urllib.error, urllib.request, and urllib.response.

These functions are included in six.moves, and the six documentation has details on what moved where. Use this information to adjust your code.

The fix_imports_six fixer recommended above does not handle all urllib moves, so manual changes may be necessary.

The string module

  • Fixer: None
  • Prevalence: Rare

In Python 2, the string module included functions that mirrored str methods, such as string.lower() and string.join() that mirror str.lower() and str.join(). These have been deprecated since Python 2.4, and they are removed in Python 3.

Convert all uses of these functions to string methods.

For example, this code:

import string
products = ['widget', 'thingy', 'whatchamacallit']
print string.join(products, sep=', ')

should be replaced with:

products = ['widget', 'thingy', 'whatchamacallit']
print(', '.join(products))

The Automated fixer: python-modernize tool doesn’t provide an automated fixer for these changes.