Skip to content

Modernizes Python code for eventual Python 3 migration. Built on top of fissix (a fork of lib2to3)

License

Notifications You must be signed in to change notification settings

superjkl/python-modernize-division-warnings

 
 

Repository files navigation

Python           _              _
   _ __  ___  __| |___ _ _ _ _ (_)______
  | '  \/ _ \/ _` / -_) '_| ' \| |_ / -_)
  |_|_|_\___/\__,_\___|_| |_||_|_/__\___|
Coveralls Read the Docs GitHub Actions PyPI

Modernize is a Python program that reads Python 2 source code and applies a series of fixers to transform it into source code that is valid on both Python 3 and Python 2.7.

This allows you to run your test suite on Python 2.7 and Python 3 so you can gradually port your code to being fully Python 3 compatible without slowing down development of your Python 2 project.

The python -m modernize command works like python -m fissix, see fissix. Here's how you'd rewrite a single file:

python -m modernize -w example.py

It does not guarantee, but it attempts to spit out a codebase compatible with Python 2.6+ or Python 3. The code that it generates has a runtime dependency on six, unless the --no-six option is used. Version 1.9.0 or later of six is recommended. Some of the fixers output code that is not compatible with Python 2.5 or lower.

Once your project is ready to run in production on Python 3 it's recommended to drop Python 2.7 support using pyupgrade

Documentation: modernize.readthedocs.io.

See the LICENSE file for the license of modernize. Using this tool does not affect licensing of the modernized code.

This library is a very thin wrapper around fissix, a fork of lib2to3.

Fork Enhancements

Same old library with the added fixers:

  • classic_division_warnings which ensures classic division warnings are issued non-native types (ie. numpy types). This is unlike the behavior of the interpreter option -Qwarnall docs.
  • import_division_future which will add from __future__ import division to any files using division

The warnings from classic_division_warnings are intended as an aid to determining which usages of division (/, /=) should be changed to floor division (//, //=) before running the fixer import_division_future.

For example if one sees:

  • only classic int division warnings for an instance of division then it should be changed from / to //
  • both classic int division and classic float division warnings for an instance of division then one must carefully consider the changes to the behavior of division once import_division_future is used

Disclaimer: the warnings are useful only if you have good test coverage. If you have poor test coverage you may not find that an instance of division is actually used with both float and int types and thus should not be changed from / to //.

Tips:

  • capture warnings into your logs with logging.captureWarnings(True) docs
  • make sure there is no warning suppression by setting the environment variable PYTHONWARNINGS=default docs

About

Modernizes Python code for eventual Python 3 migration. Built on top of fissix (a fork of lib2to3)

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Python 100.0%