個人的なpythonのformatter(yapf)のコマンドをpypiにuploadした。

個人的なpythonのformatter(yapf)のコマンドをpypiにuploadした。githubにだけおいておいてインストールするのが結構めんどくさくなったので。とは言え個人的なものであることは間違いないのでなるべく名前がかぶらないようにユニークなprefixなどを付けて公開した。

yayapf

インストールされるコマンド自体はyayapfという名前なのだけれど。元々利用しているyapf自体がyeat another python formatterの略なので"ya (yapf)"という感じ。

install

installはpipで。yayapfでもかぶらないとは思ったけれど。yapfと紛らわしいし。そもそも名前空間をあんまり汚染したくないという気持ちもあったので。poというprefixを付けた。

$ pip install po-yayapf

difference

yapfとの違いはほとんど以下の一点。

  • from foo import bar, baz 的なもののimportが気に入らなかった。

yapfの設定だと($HOME/.config/yapf/styleなどの設定によって変わるけれど)。上手くこのimportの形を死守できなかった。

from a_very_long_or_indented_module_name_yada_yad import (
    long_argument_1,
    long_argument_2,
    long_argument_3,
    long_argument_1,
    long_argument_2,
    long_argument_3,
)

時々こうなってしまう(後述)。

from a_very_long_or_indented_module_name_yada_yad import (
    long_argument_1, long_argument_2, long_argument_3, long_argument_1, long_argument_2,
    long_argument_3
)

なってほしかった挙動は

  • 末尾には必ずコンマがついている
  • importされたsymbol毎に改行されている

diffが発生しにくい感じなので。

yapfを利用したときのちょっとしたコードの書き方の使い分け

yapf自体はヒューリスティックなスコアで改行などをするかしないか決めていたはずなので。完全な整形結果の予想というのはできない(たぶん)のだけれど。 コンマが存在する部分に改行を加えたいか加えたくないかで末尾のコンマを打つか打たないかを決めている。

例えば、末尾にコンマのない関数呼びしの引数部分やdictは値毎に改行されない。

def f(x, y, z):
    return {"x": 1, "y": 2, "z": 3, "k": k}

これを以下の様にすると

-def f(x, y, z):
+def f(x, y, z,):
     return {"x": 1, "y": 2, "z": 3, "k": k}

引数部分が値毎にされる。

def f(
    x,
    y,
    z,
):
    return {"x": 1, "y": 2, "z": 3, "k": k}

dictも同様。

def f(
    x,
    y,
    z,
):
    return {
        "x": 1,
        "y": 2,
        "z": 3,
        "k": k,
    }

※ import文でもこのルールは使われるのだけれど。importに限っては元のコードがカンマで終わっていなくても常にカンマを付加してimportされて欲しいのでつけるみたいな処理が入っている。

style

ちなみに現在のyapfの設定は以下の様な感じ。

[style]
based_on_style = pep8
column_limit = 100
dedent_closing_brackets=true
spaces_around_power_operator = true
split_arguments_when_comma_terminated = true
join_multiple_lines = false