Python学習チャンネル by PyQ

Pythonのオンライン学習プラットフォームPyQのオフィシャルブログです

「Pythonの辞書の改行に関する規約はありますか」PEP8 コーディング規約、自動整形ツールblackを紹介します

f:id:kenken0326:20200527172449p:plain

質問

辞書の{} 内の改行については、規約はあるのでしょうか。

ネットで調べてみたところ、とある記事に『Pythonでは、()[]{}に囲まれた範囲内ではバックスラッシュを使わずに改行を入れて、行を分割できる。また、インデントを自由に設定できる。』と書かれていました。

「インデントは自由」とのことなのですが、これまでPyQで出てきた辞書等の改行を見ていると、一定の規則があるように思えます。(最初は { だけ残して改行、最後の } は改行して前に持っていく等)

しかし、これまで通ってきたクエストでは、改行について書かれた箇所はなかったと記憶しており、 ずっとあやふやなまま使っています。

回答

辞書の{}内の改行については、規約はあるのでしょうか。 波括弧{}内での改行について定めている規約はありません。

Pythonを書く際の作法として推奨されているPEP8という規約の中では、質問者様が調べられたように、辞書やリストの波括弧{}/ ブラケット[] / 括弧 ()内での改行とインデントは自由に決めて構わないと書かれています。


詳しくは以下で紹介します。

PEP8コーディング規約

辞書やリストの 波括弧{}/ ブラケット[] / 括弧 ()内での改行とインデントについては38-1: Pythonのコーディング規約を学ぶで紹介したPEP 8 (日本語版) インデントに以下の記載があります。

行を継続して波括弧/ブラケット/括弧を閉じる時は、リストの最後の要素が置かれた行の、はじめのホワイトスペースでない文字の直下に閉じる記号を置いても構いません。次のようにします:

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

もしくは、閉じる記号を継続された行のはじめの文字に合わせて置いても構いません。次のようにします:

my_list = [
    1, 2, 3,
    4, 5, 6,
]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
)

読みやすい書き方を意識しましょう

PEP8コーディング規約で決められている定義は上記のことまでです。 あとは各人が読みやすい書き方を試行錯誤しながら、多くの人が読みやすいと思う書き方に自然に合わせるようになります。

しかし、自然に任せていては人によって細かい差異が生まれ、統一されるまでは改行位置やインデントについての議論が発生してしまいます。これを避けるため、開発プロジェクトチームでより詳細なルールを決めることもあります。

規約で定められていないコーディングの差異を統一する手法

最近では、blackという自動整形ツールを使ってコーディング規約を強制し、blackの整形結果をそのまま受け入れるという方法が広まっています。

black

PEP8に準拠したスタイルに自動整形することができる自動整形ツールです。 $ pip install blackでインストールできます。
URL:https://github.com/psf/black

blackについては、PyQ開発チームのhirokikyが書いたblogを参考にしてみてください。

blog.hirokiky.org

Copyright ©2017-2020 BeProud Inc. All rights reserved.