概要
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 を積極的に使っていきましょう