Skip to content
Switch branches/tags
Go to file
Cannot retrieve contributors at this time


Fixers come in two types: Default and Opt-in. Default fixers should not break code except for corner cases, and are idempotent (applying them more than once to given source code will make no changes after the first application). Opt-in fixers are allowed to break these rules.

Python 2 code from Python 2.6 and older will be upgraded to code that is compatible with Python 2.6, 2.7, and Python 3.

If code is using a feature unique to Python 2.7, it will not be downgraded to work with Python 2.6. For example, dict.viewitems() usage will not be removed to make the code compatible with Python 2.6.

Some fixers rely on the latest release of the six project to work (see Fixers requiring six). If you wish to turn off these fixers to avoid an external dependency on six, then use the --no-six flag.

Fixers use the API defined by fissix. For details of how this works, and how to implement your own fixers, see Creating a fixer, at python -m modernize will try to load fixers whose full dotted-path is specified as a -f argument, but will fail if they are not found. By default, fixers will not be found in the current directory; use --fixers-here to make python -m modernize look for them there, or see the Python tutorial on modules (in particular, the parts on the search path and packages) for more info on how Python finds modules.


A default fixer will be enabled when:

  • Either no -f/--fix options are used, or -f default/--fix=default is used, or the fixer is listed explicitly in an -f/--fix option; and
  • The fixer is not listed in an -x/--nofix option; and
  • For fixers that are dependent on the six project, --no-six is not specified (see Fixers requiring six).

The -x/--nofix and --no-six options always override fixers specified using -f/--fix. The --six-unicode and --future-unicode options also disable fixers that are not applicable for those options.

Fixers requiring six

The six project provides the six module which contains various tidbits in helping to support Python 2/3 code. All six-related fixers assume the latest version of six is installed.

.. attribute:: basestring

   Replaces all references to :func:`basestring` with :data:`six.string_types`.

   .. versionadded:: 0.4

.. attribute:: dict_six

   Fixes various methods on the ``dict`` type for getting all keys, values, or
   items. E.g.::




   Care is taken to only call ``list()`` when not in an iterating context
   (e.g. not the iterable for a ``for`` loop).

.. attribute:: filter

   When a call to :func:`filter <python2:filter>` is discovered, ``from six.moves import filter`` is
   added to the module. Wrapping the use in a call to ``list()`` is done when

.. attribute:: imports_six

   Uses :mod:`six.moves` to fix various renamed modules, e.g.::

       import ConfigParser


       import six.moves.configparser

   The modules in Python 2 whose renaming in Python 3 is supported are:

   - ``__builtin__``
   - ``_winreg``
   - ``BaseHTTPServer``
   - ``CGIHTTPServer``
   - ``ConfigParser``
   - ``copy_reg``
   - ``Cookie``
   - ``cookielib``
   - ``cPickle``
   - ``Dialog``
   - ``dummy_thread``
   - ``FileDialog``
   - ``gdbm``
   - ``htmlentitydefs``
   - ``HTMLParser``
   - ``httplib``
   - ``Queue``
   - ``repr``
   - ``robotparser``
   - ``ScrolledText``
   - ``SimpleDialog``
   - ``SimpleHTTPServer``
   - ``SimpleXMLRPCServer``
   - ``SocketServer``
   - ``thread``
   - ``Tix``
   - ``tkColorChooser``
   - ``tkCommonDialog``
   - ``Tkconstants``
   - ``Tkdnd``
   - ``tkFileDialog``
   - ``tkFont``
   - ``Tkinter``
   - ``tkMessageBox``
   - ``tkSimpleDialog``
   - ``ttk``
   - ``xmlrpclib``

   .. versionadded:: 0.4

.. attribute:: input_six




       from six.moves import input

   .. versionadded:: 0.4

.. attribute:: int_long_tuple

   Changes ``(int, long)`` or ``(long, int)`` to :data:`six.integer_types`.

   .. versionadded:: 0.4

.. attribute:: map

   If a call to :func:`map <python2:map>` is discovered, ``from six.moves import map`` is added to
   the module. Wrapping the use in a call to ``list()`` is done when necessary.

.. attribute:: metaclass


       class Foo:
           __metaclass__ = Meta


       import six
       class Foo(six.with_metaclass(Meta)):

   .. seealso::

.. attribute:: raise_six

   Changes ``raise E, V, T`` to ``six.reraise(E, V, T)``.

.. attribute:: unicode_type

   Changes all reference of :func:`unicode <python2:unicode>` to

.. attribute:: urllib_six


       from urllib import quote_plus
       quote_plus('hello world')


       from six.moves.urllib.parse import quote_plus
       quote_plus('hello world')

.. attribute:: unichr

   Changes all reference of :func:`unichr <python2:unichr>` to

.. attribute:: xrange_six


       w = xrange(x)
       y = range(z)


       from six.moves import range
       w = range(x)
       y = list(range(z))

   Care is taken not to call ``list()`` when ``range()`` is used in an iterating

.. attribute:: zip

   If :func:`zip <python2:zip>` is called, ``from six.moves import zip`` is added to the module.
   Wrapping the use in a call to ``list()`` is done when necessary.

fissix fixers

Some :doc:`fixers from fissix <fissix:fixers>` in Python's standard library are run by default unmodified as their transformations are Python 2 compatible.

Fixers with no dependencies

.. attribute:: file

   Changes all calls to :func:`file <python2:file>` to :func:`open <python2:open>`.

   .. versionadded:: 0.4

.. attribute:: import

   Changes implicit relative imports to explicit relative imports and adds
   ``from __future__ import absolute_import``.

   .. versionadded:: 0.4

.. attribute:: next

   Changes all method calls from ```` to ``next(x)``.

.. attribute:: print

   Changes all usage of the ``print`` statement to use the :func:`print` function
   and adds ``from __future__ import print_function``.

.. attribute:: raise

   Changes comma-based ``raise`` statements from::

       raise E, V
       raise (((E, E1), E2), E3), V


       raise E(V)
       raise E(V)


To specify an opt-in fixer while also running all the default fixers, make sure to specify the -f default or --fix=default option, e.g.:

python -m modernize -f default -f modernize.fixes.fix_open
.. attribute:: classic_division

   When a use of the division operator -- ``/`` -- is found, add
   ``from __future__ import division`` and change the operator to ``//``.
   If ``from __future__ import division`` is already present, this fixer is

   This is intended for use in programs where ``/`` is conventionally only used
   for integer division, or where it is intended to do a manual pass after running
   ``python -m modernize`` to look for cases that should not have been changed to ``//``.
   The results of division on non-integers may differ after running this fixer:
   for example, ``3.5 / 2 == 1.75``, but ``3.5 // 2 == 1.0``.

   Some objects may override the ``__div__`` method for a use other than division,
   and thus would break when changed to use a ``__floordiv__`` method instead.

   This fixer is opt-in because it may change the meaning of code as described

   .. versionadded:: 1.0

.. attribute:: open

   When a call to :func:`open <python2:open>` is discovered, add ``from io import open`` at the top
   of the module so as to use :func:`` instead. This fixer is opt-in because it
   changes what object is returned by a call to ``open()``.

   .. versionadded:: 0.4