2020年12月25日金曜日

Python のソースコードをフォーマットする yapf を使ってみた

概要

yapf は Python のコードを自動フォーマットしてれる静的解析ツールです
今回は簡単なサンプルを使っていろいろとフォーマットしてみました

環境

  • macOS 11.1
  • Python 3.8.5

インストール

  • pipenv install yapf

試すコード

  • vim test.py
test_list = ["Apple", "Orange", "Banana", "Grape", "Strawberry", "Pineapple", "Cherry", "Pear", "Watermelon"]

test_dict = {
    "name": "hawksnowlog",
    "age": 10,
    "langs": ["Ruby", "Swift", "Python", "Golang", "JavaScript", "Java"]
}

test_tuple = (
    test_list,
    test_dict,
    {
        "1": "January",
        "2": "February",
        "3": "March",
        "4": "April",
        "5": "May"
    }
)

実行

  • PYTHONPATH=./ pipenv run yapf test.py

これでフォーマット後のコードが表示されます
上書きする場合は -i オプションを使います

  • PYTHONPATH=./ pipenv run yapf -i test.py

結果

配列など 1 行が長くなる場合には自動で改行されます
dict はなぜか key/value が改行されるようです
tuple に関しては要素を 1 行ごとに書いていたのが修正されてしまいました

test_list = [
    "Apple", "Orange", "Banana", "Grape", "Strawberry", "Pineapple", "Cherry",
    "Pear", "Watermelon"
]

test_dict = {
    "name":
    "hawksnowlog",
    "age":
    10,
    "langs": [
        "Ruby", "Swift", "Python", "Golang", "JavaScript", "Java", "HTML5",
        "CSS"
    ]
}

test_tuple = (test_list, test_dict, {
    "1": "January",
    "2": "February",
    "3": "March",
    "4": "April",
    "5": "May"
})

スタイルを変更してみる

デフォルトでは pep8 が使われているみたいです
google スタイルも使えるので使ってみます
スタイルを変更するには --style=google を指定します
また style は辞書形式で指定することもでき複数のスタイルを適用する場合は辞書形式で指定しましょう

  • PYTHONPATH=./ pipenv run yapf --style=google test.py


test_list = [
    "Apple", "Orange", "Banana", "Grape", "Strawberry", "Pineapple", "Cherry",
    "Pear", "Watermelon"
]

test_dict = {
    "name":
        "hawksnowlog",
    "age":
        10,
    "langs": [
        "Ruby", "Swift", "Python", "Golang", "JavaScript", "Java", "HTML5",
        "CSS"
    ]
}

test_tuple = (test_list, test_dict, {
    "1": "January",
    "2": "February",
    "3": "March",
    "4": "April",
    "5": "May"
})

dict に関しては若干スタイルが変わっていました

yapf を適用しない

特定の行だけ yapf を適用しない方法もあります
#yapf disable というコメントを使います

行末で使った場合はその行だけを適用しない範囲にします
行頭で使った場合は複数行に対して yapf を適用しないことができます
#yapf enable が出現する行までは適用しないようにすることができます

test_list = ["Apple", "Orange", "Banana", "Grape", "Strawberry", "Pineapple", "Cherry", "Pear", "Watermelon"] # yapf: disable

test_dict = {
    "name":
        "hawksnowlog",
    "age":
        10,
    "langs": [
        "Ruby", "Swift", "Python", "Golang", "JavaScript", "Java", "HTML5",
        "CSS"
    ]
}

# yapf: disable
test_tuple = (
    test_list,
    test_dict,
    {
        "1": "January",
        "2": "February",
        "3": "March",
        "4": "April",
        "5": "May"
    }
)
# yapf: enable

1 行の最大文字数を設定する

column_limit を使います
デフォルトでは 80 行以上にならないように改行されます

  • PYTHONPATH=./ pipenv run yapf --style='{based_on_style:google,column_limit:100}' test.py
test_list = [
    "Apple", "Orange", "Banana", "Grape", "Strawberry", "Pineapple", "Cherry", "Pear", "Watermelon"
]

test_dict = {
    "name": "hawksnowlog",
    "age": 10,
    "langs": ["Ruby", "Swift", "Python", "Golang", "JavaScript", "Java", "HTML5", "CSS"]
}

test_tuple = (test_list, test_dict, {
    "1": "January",
    "2": "February",
    "3": "March",
    "4": "April",
    "5": "May"
})

設定ファイルを使う

.style.yapf というファイルを作成するとオプションの指定をファイルに記載することができます

  • vim .style.yapf
[style]
based_on_style = google
column_limit = 100


  • PYTHONPATH=./ pipenv run yapf test.py


これで先程と同じ結果になります

最後に

公式にも記載していますが手動のフォーマットのほうがきれいに見える場合があるのでその場合は disable を積極的に使っていきましょう

参考サイト

0 件のコメント:

コメントを投稿