ひろこま Hack Log

プログラミングや機械学習などの知識を記録・共有します

Pythonコードを自動でPEP8記法に変換する

f:id:twx:20190722145422p:plain
Pythonコードを自動でPEP8記法に変換する

PEP8とは

Pythonのソースコードの書き方を定めたコーディング規約です。 世の中には色々なコーディング規約がありますが、PythonではPEP8が最もメジャーな記法です。

はじめに — pep8-ja 1.0 ドキュメント

PEP8を守るのが面倒…

しかし、初心者にとっては書き方のルールを覚えるのはかなり面倒ですし、覚えたとしても実際にスラスラ書けるかと言うと難しいでしょう。 そこでお薦めなのが、PythonコードをPEP8記法に準拠するように自動的に変換するツール autopep8 です。

インストール

pip install autopep8

使い方

autopep8  [file]

このコマンドで、pep8準拠になります。

元のソースコード

# Long comment aaaaaa  aaaaaaa aaa aaaaa a aaaaaaa aaaa aaaa aaaaa aaaa aaaa aaaaaa a aaaaaa aaa aa aaa
def long_function_name(var_one,var_two,var_three,var_four,var_five,var_six):
  print(var_one+var_two+var_three+var_four+var_five+var_six)

var_one, var_two, var_three, var_four, var_five, var_six = 1,   2,   3,   4 , 5   , 6
foo = long_function_name(  var_one, var_two, var_three, var_four, var_five, var_six)

上記コマンド実行後のソースコード

# Long comment aaaaaa  aaaaaaa aaa aaaaa a aaaaaaa aaaa aaaa aaaaa aaaa aaaa aaaaaa a aaaaaa aaa aa aaa
def long_function_name(var_one, var_two, var_three, var_four, var_five, var_six):
    print(var_one+var_two+var_three+var_four+var_five+var_six)


var_one, var_two, var_three, var_four, var_five, var_six = 1,   2,   3,   4, 5, 6
foo = long_function_name(var_one, var_two, var_three,
                         var_four, var_five, var_six)

ん?よく見ると、長いコメントが改行されていたかったり、変数を区切るスペースの数がおかしかったりと、まだ不完全な部分が見られます…

実は、

autopep8 --aggressive [file]

というオプションを付けないと、完全なpep8にはなりません。

--aggressiveを付けて実行した結果

# Long comment aaaaaa  aaaaaaa aaa aaaaa a aaaaaaa aaaa aaaa aaaaa aaaa
# aaaa aaaaaa a aaaaaa aaa aa aaa


def long_function_name(var_one, var_two, var_three,
                       var_four, var_five, var_six):
    print(var_one + var_two + var_three + var_four + var_five + var_six)


var_one, var_two, var_three, var_four, var_five, var_six = 1, 2, 3, 4, 5, 6
foo = long_function_name(
    var_one,
    var_two,
    var_three,
    var_four,
    var_five,
    var_six)

これで問題なくpep8にできました!

Vimでautopep8を使ってみる

実は、エディタのVimでautopep8コマンドを実行することができます。

~/.vimrcに以下を記載してください。

function! Preserve(command)
    " Save the last search.
    let search = @/
    " Save the current cursor position.
    let cursor_position = getpos('.')
    " Save the current window position.
    normal! H
    let window_position = getpos('.')
    call setpos('.', cursor_position)
    " Execute the command.
    execute a:command
    " Restore the last search.
    let @/ = search
    " Restore the previous window position.
    call setpos('.', window_position)
    normal! zt
    " Restore the previous cursor position.
    call setpos('.', cursor_position)
endfunction

function! Autopep8()
    call Preserve(':silent %!autopep8 --aggressive -')
endfunction

" Shift + F で自動修正
autocmd FileType python nnoremap <S-f> :call Autopep8()<CR>

これを保存した上で、vimを起動し、コマンドモード中に Shift + Fを押すとvim上でautopep8が発動します。とても便利です。

以上、Pythonコードを自動でPEP8記法に変換する方法をまとめてみました。良い記事だと思っていただいた方は、以下の「★+」ボタンのクリック、SNSでのシェア、「読者になる」ボタンのクリックをお願いします。

Koma Hirokazu 's Hacklog ―― Copyright © 2018 Koma Hirokazu