• Stars
    star
    4,497
  • Rank 9,063 (Top 0.2 %)
  • Language
    Python
  • License
    MIT License
  • Created over 13 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A tool that automatically formats Python code to conform to the PEP 8 style guide.

autopep8

PyPI Version Build status Code Coverage

autopep8 automatically formats Python code to conform to the PEP 8 style guide. It uses the pycodestyle utility to determine what parts of the code needs to be formatted. autopep8 is capable of fixing most of the formatting issues that can be reported by pycodestyle.

Installation

From pip:

$ pip install --upgrade autopep8

Consider using the --user option.

Requirements

autopep8 requires pycodestyle.

Usage

To modify a file in place (with aggressive level 2):

$ autopep8 --in-place --aggressive --aggressive <filename>

Before running autopep8.

import math, sys;

def example1():
    ####This is a long comment. This should be wrapped to fit within 72 characters.
    some_tuple=(   1,2, 3,'a'  );
    some_variable={'long':'Long code lines should be wrapped within 79 characters.',
    'other':[math.pi, 100,200,300,9876543210,'This is a long string that goes on'],
    'more':{'inner':'This whole logical line should be wrapped.',some_tuple:[1,
    20,300,40000,500000000,60000000000000000]}}
    return (some_tuple, some_variable)
def example2(): return {'has_key() is deprecated':True}.has_key({'f':2}.has_key(''));
class Example3(   object ):
    def __init__    ( self, bar ):
     #Comments should have a space after the hash.
     if bar : bar+=1;  bar=bar* bar   ; return bar
     else:
                    some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
                    return (sys.path, some_string)

After running autopep8.

import math
import sys


def example1():
    # This is a long comment. This should be wrapped to fit within 72
    # characters.
    some_tuple = (1, 2, 3, 'a')
    some_variable = {
        'long': 'Long code lines should be wrapped within 79 characters.',
        'other': [
            math.pi,
            100,
            200,
            300,
            9876543210,
            'This is a long string that goes on'],
        'more': {
            'inner': 'This whole logical line should be wrapped.',
            some_tuple: [
                1,
                20,
                300,
                40000,
                500000000,
                60000000000000000]}}
    return (some_tuple, some_variable)


def example2(): return ('' in {'f': 2}) in {'has_key() is deprecated': True}


class Example3(object):
    def __init__(self, bar):
        # Comments should have a space after the hash.
        if bar:
            bar += 1
            bar = bar * bar
            return bar
        else:
            some_string = """
                       Indentation in multiline strings should not be touched.
Only actual code should be reindented.
"""
            return (sys.path, some_string)

Options:

usage: autopep8 [-h] [--version] [-v] [-d] [-i] [--global-config filename]
                [--ignore-local-config] [-r] [-j n] [-p n] [-a]
                [--experimental] [--exclude globs] [--list-fixes]
                [--ignore errors] [--select errors] [--max-line-length n]
                [--line-range line line] [--hang-closing] [--exit-code]
                [files [files ...]]

Automatically formats Python code to conform to the PEP 8 style guide.

positional arguments:
  files                 files to format or '-' for standard in

optional arguments:
  -h, --help            show this help message and exit
  --version             show program's version number and exit
  -v, --verbose         print verbose messages; multiple -v result in more
                        verbose messages
  -d, --diff            print the diff for the fixed source
  -i, --in-place        make changes to files in place
  --global-config filename
                        path to a global pep8 config file; if this file does
                        not exist then this is ignored (default:
                        ~/.config/pep8)
  --ignore-local-config
                        don't look for and apply local config files; if not
                        passed, defaults are updated with any config files in
                        the project's root directory
  -r, --recursive       run recursively over directories; must be used with
                        --in-place or --diff
  -j n, --jobs n        number of parallel jobs; match CPU count if value is
                        less than 1
  -p n, --pep8-passes n
                        maximum number of additional pep8 passes (default:
                        infinite)
  -a, --aggressive      enable non-whitespace changes; multiple -a result in
                        more aggressive changes
  --experimental        enable experimental fixes
  --exclude globs       exclude file/directory names that match these comma-
                        separated globs
  --list-fixes          list codes for fixes; used by --ignore and --select
  --ignore errors       do not fix these errors/warnings (default:
                        E226,E24,W50,W690)
  --select errors       fix only these errors/warnings (e.g. E4,W)
  --max-line-length n   set maximum allowed line length (default: 79)
  --line-range line line, --range line line
                        only fix errors found within this inclusive range of
                        line numbers (e.g. 1 99); line numbers are indexed at
                        1
  --hang-closing        hang-closing option passed to pycodestyle
  --exit-code           change to behavior of exit code. default behavior of
                        return value, 0 is no differences, 1 is error exit.
                        return 2 when add this option. 2 is exists
                        differences.

Features

autopep8 fixes the following issues reported by pycodestyle:

E101 - Reindent all lines.
E11  - Fix indentation.
E121 - Fix indentation to be a multiple of four.
E122 - Add absent indentation for hanging indentation.
E123 - Align closing bracket to match opening bracket.
E124 - Align closing bracket to match visual indentation.
E125 - Indent to distinguish line from next logical line.
E126 - Fix over-indented hanging indentation.
E127 - Fix visual indentation.
E128 - Fix visual indentation.
E129 - Fix visual indentation.
E131 - Fix hanging indent for unaligned continuation line.
E133 - Fix missing indentation for closing bracket.
E20  - Remove extraneous whitespace.
E211 - Remove extraneous whitespace.
E22  - Fix extraneous whitespace around keywords.
E224 - Remove extraneous whitespace around operator.
E225 - Fix missing whitespace around operator.
E226 - Fix missing whitespace around arithmetic operator.
E227 - Fix missing whitespace around bitwise/shift operator.
E228 - Fix missing whitespace around modulo operator.
E231 - Add missing whitespace.
E241 - Fix extraneous whitespace around keywords.
E242 - Remove extraneous whitespace around operator.
E251 - Remove whitespace around parameter '=' sign.
E252 - Missing whitespace around parameter equals.
E26  - Fix spacing after comment hash for inline comments.
E265 - Fix spacing after comment hash for block comments.
E266 - Fix too many leading '#' for block comments.
E27  - Fix extraneous whitespace around keywords.
E301 - Add missing blank line.
E302 - Add missing 2 blank lines.
E303 - Remove extra blank lines.
E304 - Remove blank line following function decorator.
E305 - Expected 2 blank lines after end of function or class.
E306 - Expected 1 blank line before a nested definition.
E401 - Put imports on separate lines.
E402 - Fix module level import not at top of file
E501 - Try to make lines fit within --max-line-length characters.
E502 - Remove extraneous escape of newline.
E701 - Put colon-separated compound statement on separate lines.
E70  - Put semicolon-separated compound statement on separate lines.
E711 - Fix comparison with None.
E712 - Fix comparison with boolean.
E713 - Use 'not in' for test for membership.
E714 - Use 'is not' test for object identity.
E721 - Use "isinstance()" instead of comparing types directly.
E722 - Fix bare except.
E731 - Use a def when use do not assign a lambda expression.
W291 - Remove trailing whitespace.
W292 - Add a single newline at the end of the file.
W293 - Remove trailing whitespace on blank line.
W391 - Remove trailing blank lines.
W503 - Fix line break before binary operator.
W504 - Fix line break after binary operator.
W605 - Fix invalid escape sequence 'x'.
W690 - Fix various deprecated code (via lib2to3).

autopep8 also fixes some issues not found by pycodestyle.

  • Correct deprecated or non-idiomatic Python code (via lib2to3). Use this for making Python 2.7 code more compatible with Python 3. (This is triggered if W690 is enabled.)
  • Normalize files with mixed line endings.
  • Put a blank line between a class docstring and its first method declaration. (Enabled with E301.)
  • Remove blank lines between a function declaration and its docstring. (Enabled with E303.)

autopep8 avoids fixing some issues found by pycodestyle.

  • E112/E113 for non comments are reports of bad indentation that break syntax rules. These should not be modified at all.
  • E265, which refers to spacing after comment hash, is ignored if the comment looks like code. autopep8 avoids modifying these since they are not real comments. If you really want to get rid of the pycodestyle warning, consider just removing the commented-out code. (This can be automated via eradicate.)

More advanced usage

By default autopep8 only makes whitespace changes. Thus, by default, it does not fix E711 and E712. (Changing x == None to x is None may change the meaning of the program if x has its __eq__ method overridden.) Nor does it correct deprecated code W6. To enable these more aggressive fixes, use the --aggressive option:

$ autopep8 --aggressive <filename>

Use multiple --aggressive to increase the aggressiveness level. For example, E712 requires aggressiveness level 2 (since x == True could be changed to either x or x is True, but autopep8 chooses the former).

--aggressive will also shorten lines more aggressively. It will also remove trailing whitespace more aggressively. (Usually, we don't touch trailing whitespace in docstrings and other multiline strings. And to do even more aggressive changes to docstrings, use docformatter.)

To enable only a subset of the fixes, use the --select option. For example, to fix various types of indentation issues:

$ autopep8 --select=E1,W1 <filename>

If the file being fixed is large, you may want to enable verbose progress messages:

$ autopep8 -v <filename>

Passing in --experimental enables the following functionality:

  • Shortens code lines by taking its length into account
$ autopep8 --experimental <filename>

Disabling line-by-line

It is possible to disable autopep8 untill it it turned back on again in the file, using autopep8: off and then renabling autopep8: on.

# autopep8: off
    [
        [23, 23, 13, 43],
        [32, 34, 34, 34],
        [56, 34, 34, 11],
        [10, 10, 10, 10],
    ]
# autopep8: on

fmt: off and fmt: on are also valid.

Use as a module

The simplest way of using autopep8 as a module is via the fix_code() function:

>>> import autopep8
>>> autopep8.fix_code('x=       123\n')
'x = 123\n'

Or with options:

>>> import autopep8
>>> autopep8.fix_code('print( 123 )\n',
...                   options={'ignore': ['E']})
'print( 123 )\n'

Configuration

By default, if $HOME/.config/pycodestyle (~\.pycodestyle in Windows environment) exists, it will be used as global configuration file. Alternatively, you can specify the global configuration file with the --global-config option.

Also, if setup.cfg, tox.ini, .pep8 and .flake8 files exist in the directory where the target file exists, it will be used as the configuration file.

pep8, pycodestyle, and flake8 can be used as a section.

configuration file example:

[pycodestyle]
max_line_length = 120
ignore = E501

pyproject.toml

autopep8 can also use pyproject.toml. The section must be [tool.autopep8], and pyproject.toml takes precedence over any other configuration files.

configuration file example:

[tool.autopep8]
max_line_length = 120
ignore = "E501,W6"  # or ["E501", "W6"]
in-place = true
recursive = true
aggressive = 3

Usage with pre-commit

autopep8 can be used as a hook for pre-commit.

To add autopep8 as a plugin, add this repo definition to your configuration:

repos:
-   repo: https://github.com/hhatto/autopep8
    rev: ...  # select the tag or revision you want, or run `pre-commit autoupdate`
    hooks:
    -   id: autopep8

Testing

Test cases are in test/test_autopep8.py. They can be run directly via python test/test_autopep8.py or via tox. The latter is useful for testing against multiple Python interpreters. (We currently test against CPython versions 3.7, 3.8, 3.9 and 3.10. We also test against PyPy.)

Broad spectrum testing is available via test/acid.py. This script runs autopep8 against Python code and checks for correctness and completeness of the code fixes. It can check that the bytecode remains identical. test/acid_pypi.py makes use of acid.py to test against the latest released packages on PyPI.

Troubleshooting

pkg_resources.DistributionNotFound

If you are using an ancient version of setuptools, you might encounter pkg_resources.DistributionNotFound when trying to run autopep8. Try upgrading setuptools to workaround this setuptools problem:

$ pip install --upgrade setuptools

Use sudo if you are installing to the system.

Links

More Repositories

1

nude.py

Nudity detection with Python
Python
915
star
2

gocloc

A little fast cloc(Count Lines Of Code)
Go
703
star
3

pgmagick

pgmagick is a yet another boost.python based wrapper for GraphicsMagick/ImageMagick.
C++
146
star
4

python-hoedown

The Python binding for hoedown, a markdown parsing library.
HTML
50
star
5

gorst

Go implementation of reStructuredText
Go
33
star
6

pyrapidjson

Python binding for rapidjson
C++
26
star
7

poyonga

Python Groonga Client
Python
22
star
8

cargo-strict

avoid unwrap() method
Rust
18
star
9

kamasu

HTTP/HTTPS/HTTP2 Proxy for PHP Built-in Server, written in Rust
Rust
15
star
10

gruffy

Gruffy is Python implemetation of Gruff(Ruby's Graphing Library http://nubyonrails.com/pages/gruff)
Python
14
star
11

goroo

Yet Another Groonga Client for Go
Go
11
star
12

peg-rst

reStructuredText in C
C
11
star
13

otamapy

otama Python Interface
C
11
star
14

meow

Yet another markdown/reST preview server (based on moo)
JavaScript
9
star
15

zsh_completions

my zsh compeltion functions
Python
8
star
16

jc

command-line tool for jenkins-ci
Go
8
star
17

ftcat

markdown live previewer
Go
7
star
18

kuroko

Minimalistic Python Task Executor
Python
7
star
19

nem2-rs

NEM SDK for Rust
Rust
6
star
20

boom-rust

Rust implementation of boom
Rust
6
star
21

zoth

CLI Cache Tool
Rust
6
star
22

cargo-quickfix

Rust
5
star
23

fpath

fast Python's os.path module written in Rust
Python
5
star
24

pit-rs

pit in Rust
Rust
4
star
25

php-otama

PHP extension for otama
C
4
star
26

pyjsmn

Python extension for jsmn
C
4
star
27

fcsv

yet another Python csv module written in Rust
Python
4
star
28

cargobench-plot

Rust
3
star
29

python-pegmarkdown

Python binding for PEG-markdown
Python
3
star
30

backlog-rs

Nulab's Backlog API bindings for Rust
Rust
3
star
31

genzshcomp

Python
3
star
32

ray-tracing-in-one-weekend-in-rust

Rust
3
star
33

python-workq

Python Client for Workq (https://github.com/iamduo/workq)
Python
3
star
34

tamatebako

Rust
3
star
35

aiogrn

asyncio Groonga Client library
Python
2
star
36

pixiv-isucon2016-rust

Rust
2
star
37

pgstatprof

sampling profiler for PostgreSQL
Rust
2
star
38

nanairo

nanairo is a Go library that make the colorized output of terminal applications
Go
2
star
39

go-genzshcomp

generate zsh completion function from Go flag's help text
Go
2
star
40

go-rlogger

rlogger with Go
Go
2
star
41

pywebp

Yet Another Python libwebp wrapper.
C
2
star
42

hhatto

2
star
43

nuxt-vercel-boilerplate

Vue
2
star
44

sphinxcontrib-gruffygen

render Graph Extension for Sphinx
Python
2
star
45

fast-woothee-python

Rust
1
star
46

jubatus-rust-client

jubatus client in Rust
Rust
1
star
47

fastapi-snippets

FastAPI snippet
Python
1
star
48

rust-rlogger

rlogger with Rust
Rust
1
star
49

openweathermap-cli

CLI tool for OpenWeatherMap (written by Go)
Go
1
star
50

hhatto.github.io

HTML
1
star
51

slowfast

Two Python code compare using timeit module
Python
1
star
52

ss-ogp-image

TypeScript
1
star
53

rcoin

blockchain example written in Rust
Rust
1
star
54

zci

Zsh Completion function Installer
Python
1
star
55

go-scrapbox-parser

Go
1
star
56

libvmod-woothee

user agent parser for VMOD (Rust implementation)
M4
1
star
57

python-kcipher2

Python implementation of KCipher2 stream cipher
Python
1
star
58

homebrew-pgmagick

brew for pgmagick
Ruby
1
star
59

homebrew-python-mecab

homebrew for python-mecab
Ruby
1
star
60

rust-ens

Rust ENS(Ethereum Name Service) interface
Rust
1
star
61

klip

Go parser for the Kindle's clippings.txt file
Go
1
star
62

goodc

goodcheck clone written in Rust
Rust
1
star
63

go-coverhtml-ng

next-generatation go tool cover -html
1
star
64

homebrew-otama

homebrew for otama
Ruby
1
star
65

wwup-in-rust

[unofficial] example code for Working With Unix Processes in Rust
Rust
1
star