项目作者: myint

项目描述 :
Removes unused imports and unused variables as reported by pyflakes
高级语言: Python
项目地址: git://github.com/myint/autoflake.git
创建时间: 2012-12-27T03:40:17Z
项目社区:https://github.com/myint/autoflake

开源协议:MIT License

下载


autoflake

Build Status

Introduction

autoflake removes unused imports and unused variables from Python code. It
makes use of pyflakes to do this.

By default, autoflake only removes unused imports for modules that are part of
the standard library. (Other modules may have side effects that make them
unsafe to remove automatically.) Removal of unused variables is also disabled
by default.

autoflake also removes useless pass statements by default.

Example

Running autoflake on the below example

  1. $ autoflake --in-place --remove-unused-variables example.py
  1. import math
  2. import re
  3. import os
  4. import random
  5. import multiprocessing
  6. import grp, pwd, platform
  7. import subprocess, sys
  8. def foo():
  9. from abc import ABCMeta, WeakSet
  10. try:
  11. import multiprocessing
  12. print(multiprocessing.cpu_count())
  13. except ImportError as exception:
  14. print(sys.version)
  15. return math.pi

results in

  1. import math
  2. import sys
  3. def foo():
  4. try:
  5. import multiprocessing
  6. print(multiprocessing.cpu_count())
  7. except ImportError:
  8. print(sys.version)
  9. return math.pi

Installation

  1. $ pip install --upgrade autoflake

Advanced usage

To allow autoflake to remove additional unused imports (other than
than those from the standard library), use the --imports option. It
accepts a comma-separated list of names:

  1. $ autoflake --imports=django,requests,urllib3 <filename>

To remove all unused imports (whether or not they are from the standard
library), use the --remove-all-unused-imports option.

To remove unused variables, use the --remove-unused-variables option.

Below is the full listing of options:

  1. usage: autoflake [-h] [-c | -cd] [-r] [-j n] [--exclude globs] [--imports IMPORTS] [--expand-star-imports] [--remove-all-unused-imports] [--ignore-init-module-imports] [--remove-duplicate-keys] [--remove-unused-variables]
  2. [--remove-rhs-for-unused-variables] [--ignore-pass-statements] [--ignore-pass-after-docstring] [--version] [--quiet] [-v] [--stdin-display-name STDIN_DISPLAY_NAME] [--config CONFIG_FILE] [-i | -s]
  3. files [files ...]
  4. Removes unused imports and unused variables as reported by pyflakes.
  5. positional arguments:
  6. files files to format
  7. options:
  8. -h, --help show this help message and exit
  9. -c, --check return error code if changes are needed
  10. -cd, --check-diff return error code if changes are needed, also display file diffs
  11. -r, --recursive drill down directories recursively
  12. -j n, --jobs n number of parallel jobs; match CPU count if value is 0 (default: 0)
  13. --exclude globs exclude file/directory names that match these comma-separated globs
  14. --imports IMPORTS by default, only unused standard library imports are removed; specify a comma-separated list of additional modules/packages
  15. --expand-star-imports
  16. expand wildcard star imports with undefined names; this only triggers if there is only one star import in the file; this is skipped if there are any uses of `__all__` or `del` in the file
  17. --remove-all-unused-imports
  18. remove all unused imports (not just those from the standard library)
  19. --ignore-init-module-imports
  20. exclude __init__.py when removing unused imports
  21. --remove-duplicate-keys
  22. remove all duplicate keys in objects
  23. --remove-unused-variables
  24. remove unused variables
  25. --remove-rhs-for-unused-variables
  26. remove RHS of statements when removing unused variables (unsafe)
  27. --ignore-pass-statements
  28. ignore all pass statements
  29. --ignore-pass-after-docstring
  30. ignore pass statements after a newline ending on '"""'
  31. --version show program's version number and exit
  32. --quiet Suppress output if there are no issues
  33. -v, --verbose print more verbose logs (you can repeat `-v` to make it more verbose)
  34. --stdin-display-name STDIN_DISPLAY_NAME
  35. the name used when processing input from stdin
  36. --config CONFIG_FILE Explicitly set the config file instead of auto determining based on file location
  37. -i, --in-place make changes to files instead of printing diffs
  38. -s, --stdout print changed text to stdout. defaults to true when formatting stdin, or to false otherwise

To ignore the file, you can also add a comment to the top of the file:

  1. # autoflake: skip_file
  2. import os

Configuration

Configure default arguments using a pyproject.toml file:

  1. [tool.autoflake]
  2. check = true
  3. imports = ["django", "requests", "urllib3"]

Or a setup.cfg file:

  1. [autoflake]
  2. check=true
  3. imports=django,requests,urllib3

The name of the configuration parameters match the flags (e.g. use the
parameter expand-star-imports for the flag --expand-star-imports).

Tests

To run the unit tests::

  1. $ ./test_autoflake.py

There is also a fuzz test, which runs against any collection of given Python
files. It tests autoflake against the files and checks how well it does by
running pyflakes on the file before and after. The test fails if the pyflakes
results change for the worse. (This is done in memory. The actual files are
left untouched.)::

  1. $ ./test_fuzz.py --verbose

Excluding specific lines

It might be the case that you have some imports for their side effects, even
if you are not using them directly in that file.

That is common, for example, in Flask based applications. In where you import
Python modules (files) that imported a main app, to have them included in
the routes.

For example:

  1. from .endpoints import role, token, user, utils

As those imports are not being used directly, if you are using the option
--remove-all-unused-imports, they would be removed.

To prevent that, without having to exclude the entire file, you can add a
# noqa comment at the end of the line, like:

  1. from .endpoints import role, token, user, utils # noqa

That line will instruct autoflake to let that specific line as is.

Using pre-commit hooks

Add the following to your .pre-commit-config.yaml

  1. - repo: https://github.com/PyCQA/autoflake
  2. rev: v2.3.1
  3. hooks:
  4. - id: autoflake

When customizing the arguments, make sure you include --in-place in the list
of arguments:

  1. - repo: https://github.com/PyCQA/autoflake
  2. rev: v2.3.1
  3. hooks:
  4. - id: autoflake
  5. args: [--remove-all-unused-imports, --in-place]