Pythonコードを自動フォーマットしたい(autopep8)

3 min読了の目安(約3100字TECH技術記事

概要

汚いpythonコードをautopep8を使ってきれいなコードに直しました。

環境

$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.6
BuildVersion:	19G2021

$ python3 --version
Python 3.7.3

インストール

$ pip3 install autopep8

### こちらもあると嬉しい
$ pip3 install flake8

使い方

autopep8はPEP8スタイルに準拠するようにコードフォーマットをしてくれます。
-dで現在のコードとの差分が見れます。
今回はslackに投稿するコード(autopep8test.py)を修正してみました。

### -d, --diff: print the diff for the fixed source
$ autopep8 --diff autopep8test.py

変更後のコードに問題がなく適応する場合は

### -i, --in-place: make changes to files in place
$ autopep8 --in-place autopep8test.py
### もしくは
$ autopep8 autopep8test.py > newfile.py

結果は

元のコード

$ cat autopep8test.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests, json
def post(bot_name:str, msg:str) -> int:
    CHANNEL = '<<CHANNEL>>'; TOKEN = '<<TOKEN>>'
    URL = 'https://slack.com/api/chat.postMessage'

    headers = { 'Content-Type': 'application/json' }
    data = {
      'channel': CHANNEL, 'token': TOKEN,
        'username': bot_name, 'text': msg
        }
    requests.post(url=URL, headers=headers, data=json.dumps(data))

post('mybot', 'hello')

diff

$ autopep8 --diff autopep8test.py
--- original/autopep8test.py
+++ fixed/autopep8test.py
@@ -1,15 +1,20 @@
 #!/usr/bin/env python3
 # -*- coding: utf-8 -*-
-import requests, json
-def post(bot_name:str, msg:str) -> int:
-    CHANNEL = '<<CHANNEL>>'; TOKEN = '<<TOKEN>>'
+import requests
+import json
+
+
+def post(bot_name: str, msg: str) -> int:
+    CHANNEL = '<<CHANNEL>>'
+    TOKEN = '<<TOKEN>>'
     URL = 'https://slack.com/api/chat.postMessage'

-    headers = { 'Content-Type': 'application/json' }
+    headers = {'Content-Type': 'application/json'}
     data = {
-      'channel': CHANNEL, 'token': TOKEN,
+        'channel': CHANNEL, 'token': TOKEN,
         'username': bot_name, 'text': msg
-        }
+    }
     requests.post(url=URL, headers=headers, data=json.dumps(data))

+
 post('mybot', 'hello')

完成したコード

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import json


def post(bot_name: str, msg: str) -> int:
    CHANNEL = '<<CHANNEL>>'
    TOKEN = '<<TOKEN>>'
    URL = 'https://slack.com/api/chat.postMessage'

    headers = {'Content-Type': 'application/json'}
    data = {
        'channel': CHANNEL, 'token': TOKEN,
        'username': bot_name, 'text': msg
    }
    requests.post(url=URL, headers=headers, data=json.dumps(data))


post('mybot', 'hello')

対応した問題点

$ flake8 autopep8test.py
autopep8test.py:3:16: E401 multiple imports on one line
autopep8test.py:4:1: E302 expected 2 blank lines, found 0
autopep8test.py:4:18: E231 missing whitespace after ':'
autopep8test.py:4:27: E231 missing whitespace after ':'
autopep8test.py:5:28: E702 multiple statements on one line (semicolon)
autopep8test.py:8:16: E201 whitespace after '{'
autopep8test.py:8:51: E202 whitespace before '}'
autopep8test.py:11:9: E131 continuation line unaligned for hanging indent
autopep8test.py:15:1: E305 expected 2 blank lines after class or function definition, found 1
	
↓
	
$ flake8 autopep8test.py
### 出力なし

diffとflake8で確認しながらすすめると安心ですね!