IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第53回 Python のPEP8に準拠したスペースの使い方を学んでみた。(その1) (菱沼佑香) 2024年5月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

前回から3章の「Blackを使ってコードフォーマットを整える」に入り、コードフォーマッターとPEP8について学びました。
今回はPEP8の中でも記述があるスペースの使い方について学んでみたいと思います。

スペースのありようで見やすさが段違い

まずはテキストの引用から。

---------------------------------------------------------------
P.49
スペースはコードを読みやすくするために必須で、コードそのものと同じくらい重要です。
スペースを使ってコードを意味が分かりやすいように切り分け、見やすくする役割を果たします。
---------------------------------------------------------------

例えば、こちらは以前、ヒット&エラーのゲームを作る前段階の学習で利用したサンプルコードで、ランダムな1桁の数字を出して当てるというものです。そのサンプルコードを、通常版、スペースなし版、スペース位置をバラバラにした版で並べてみました。全部ちゃんと動きます。
(スペースの位置は赤ぽちつけています。)

fig01

左が元のコードで、こちらはスペースの位置がルールにのっとった形で入っています。見やすいですよね。一方、真ん中のスペースなしは、まあ見れないことはないけどちょっと目がしょぼしょぼする...という印象がしますし、右側のものはスペース位置がなんだか雑多な感じがします。
スペースの位置によって見え方の印象が違うというのがわかるかなと思います。

自分で使うだけでとりあえず書くだけならスペースなしでもいいんじゃないのと思いたくなりますが、後々改変する可能性や、別の用途に流用するかもしれないこと、今後のための癖づけを考えれば、左側のサンプルのように、きちんとしておいた方が後々困らなそうです。
また、いろいろな方と一緒にコードを作る、見てもらう機会があるとするならば、スペース位置は全員同じルールで整っていた方が、コードの見やすさというのも違いが出てくるのは当然なので、PEP8は大切な位置にいるんだなーと思いました。

PythonのインデントはtabキーNG、スペース4つで

というわけで、スペースの位置ひとつとっても、自分にも、他人にもやさしくなるという意味が分かったところで、続きへ。

---------------------------------------------------------------
P.49
3.3.1 インデントには空白文字を使う
インデントは、行の先頭にあるスペースのことです。コードのインデントには、空白文字やタブを使います。どちらでもかまいませんが、インデントにはタブではなく空白文字を使うのがベストです。
その理由は、これらの文字は挙動が異なるからです。空白文字は' 'のように画面上では常に1文字分のスペースとして表示されます。タブ文字はエスケープ文字を含む文字列'\t'として表示されますが、そうでない場合もあって少しあいまいです。必ずというわけではありませんが、タブは下辺のスペースとして表示されることがあるので、タブの後に続くテキストは次のタブストップ(タブを使った場合の区切り位置)から始まります。タブストップは8文字分ごとに配置されています。次のインタラクティブシェルの例では、最初に空白文字で単語を区切り、次にタブ文字で単語を区切っています。

fig02

タブはさまざまな幅のスペースを表すので、ソースコードでの使用は避けるべきです。ほとんどのコードエディターやIDEは、TABキーを押すとタブ文字の代わりに4つか8つの空白文字を自動的に挿入します。
また、同じコードブロック内でタブと空白文字をインデントに使用することはできません。
(中略)
Pythonコードでは、一般的に1階層のインデントにつき、4つの空白文字が使われます。
(中略)
インデントに4文字スペースを使うのが一般的なのは、8文字だとコードがすぐに行端に達してしまうし、2文字だとインデントの差が分かりにくいからです。
---------------------------------------------------------------

※例にある「\n」と「\t」は、改行とタブ文字の正規表現です。本文ではバックスラッシュで表現されています。どっちにしても見にくい...。

インデントは、ソースコードを書いていて次の行に移るときにペコっと出てくる空白箇所です。エディタで書いていると勝手に入れてくれますよね。(赤い四角の部分)

fig03

エディタが自動でつけてくれたインデントも、きちんとスペース4文字になっています。とりあえず、Pythonのインデントはスペース4つ!と覚えておきましょう。タブは使いたくなるかもしれませんが、使いません。なお、Black様を使用していると強制的にスペース4文字に変更されます。

そういえば、ほかの言語ではいかようかと気になって調べたところ、昔はタブキーを使っていたこともあったそうですが、スペースは2つだ4つだ8つだというものがあるそうです。ちなみにWordPressでコーディイングするときはタブキー絶対なんだそうな。気になる方は以下の参考記事もプチ知識的にぜひ。

参考)
インデントはタブとスペースのどっちを使うべきなのか?
ソースコードのインデント(字下げ)に、タブを使うか半角スペースを使うかという話

コードを読みやすくするスペースの入れ方は?

では次に行内のスペースについてです。「=」とか、「,(カンマ)」の前後でどうスペースを入れるかというところです。

---------------------------------------------------------------
P.50
3.3.2 行内のスペース
行内のスペースには、単なるインデントだけでなくさまざまな意味があります。スペースを適度に入れないと、行が詰まってしまい読みにくくなりますので、スペースを入れてコードを区切り、視覚的にわかりやすくするのは重要です。
(中略)
演算子と識別子の間にスペースを置かないと、コードが一緒になっているように見えてしまいます。例えば次のコードでは、演算子と変数の間にスペースを入れています。

fig04

次の例ではスペースをすべて削除しています。

fig05

どちらの場合も+演算子を用いて3つの値を加算していますが、スペースなしの場合はblakns[i+1:]の+が4つの値を加算しているように見えます。空白を入れることで、この+がblanksに対するスライスの一部であることがより明確になります。
区切り文字の前ではなく、後にスペースを入れる
リストや辞書、def文の関数パラメーターは、コンマを使って区切ります。次の例のように、コンマの前にはスペースを置かず、後ろに置きましょう。

fig06

スペースを入れないと、コードが詰まって読みづらくなってしまいます。

fig07

区切り文字の前にまでスペースを入れてしまうと、不必要に区切り文字に目が行ってしまいます。

fig08

Blackを使うと、自動的にコンマの後にスペースを挿入し、コンマの前のスペースを削除します。
---------------------------------------------------------------

スペースを入れる位置で受ける印象が本当に違いますね。
()内のカンマの位置ってどこだっけと思いがちなので、忘れないようにしたいと思います。

それではきりが良いので、今回はこちらで終了です。次回も引き続き、スペースの使い方について学びたいと思います。
今回もお付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes