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

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

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

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

第55回 Python のPEP8に準拠した空行の入れ方を学んでみた。 (菱沼佑香) 2024年7月

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

前回はPEP8の中でも記述があるスペースの使い方について学びました。今回はPEP8で推奨されている空行の挿入方法と、import文の記述ルールについて学びます。

PEP8では空行はどう入れてほしいと書かれているか

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

---------------------------------------------------------------
P.53
文章を書くときに段落を設けることで文章を見やすくするのと同じように、適度に空行を入れることで、コードのある部分をまとめたり、グループごとに切り分けたりすることができます。
PEP8には、コードに空行を入れるときのガイドラインがあり、関数は空行2つ、クラスも空行2つ、クラス内のメソッドは空行1つで区切るべきだとしています。Blackはこれらのルールに従って、自動的にコードに空行を挿入したり削除したりします。
---------------------------------------------------------------

いままでテキストで学習してきた中で、そういえば空行って意識したことないな...とこの文章を読んでいて思いました。何となく、自分で見やすい感じか、テキスト通りに入れている程度です。それでも2行も入れてたかな...というくらいには意識していませんでした。
というわけで、ここで書籍に書かれていたサンプルを並べてみます。
fig01
見やすさは段違いですね。
基本は行の頭の前にインデントが入ってない=空行2つ、行の頭の前にインデントが入ってる=メソッド=空行1つで覚えておきたいと思います。

空行の入れ方に困ったときは主観でOK

次に空行の挿入例を書いてくれています。
ではテキストを引用します。

---------------------------------------------------------------
P.54
Blackでは、関数やメソッド、グローバルスコープ内の空行をどこに置くかをきめることができません。どの行をまとめるかは、プログラマーの主観的な判断に委ねられます。
例えば、Django Webフレームワークのvalidators.pyにあるEmailValidatorクラスを見てみましょう。このコードがどのように動作するかを理解する日通用はありませんが、__call__()メソッドのコードが空行で4つのグループに分けられていることに注目してください。
fig02
(中略)空行を入れてグループ化することで処理内容の違いを示しています。①の部分は、valueパラメーターに@マークがあるかどうかをチェックします。この作業は、valueに含まれるメールアドレスの文字列をuser_partとdomain_partの変数に分割する②の作業とは異なります。③と④は、これらの変数を使ってそれぞれメールアドレスのユーザー部分とドメイン部分を検証しています。
4つ目のグループの行数は11行とほかのグループよりもはるかに多いのですが、これらは全てメールアドレスのドメインを検証するという同じタスクに関連しています。もしこのタスクが複数のサブタスクで構成されていると感じたら、空行を挿入してそれらを分離してもよいでしょう。
Djangoのこの部分を担当したプログラマーは、ドメイン検証の行はすべて1つのグループに属するべきだと判断しましたが、他のプログラマーはそうは思わないかもしれません。これは主観的なものなので、Blackでは関数やメソッド内の空行数を変更しないようになっています。
---------------------------------------------------------------

俺様Black様でも入り込まない部分あるんだ...と思いつつ。
確かに4つ目のifのグループで空行が入りまくっていたらちょっと見づらいかもしれません。基本はどうするだけ覚えておいて、あとは見やすい、理解しやすい空行の入れ方はどうかを考えればよさそうです。

知らなかったセミコロンの活用法

ところで、セミコロンに実は、行を区切るという機能があるらしいです。

---------------------------------------------------------------
P.55
Pythonの余り知られていない機能の1つに、セミコロンを使って1行の中の複数の文を区切ることができるというものがあります。
fig03
この2行のコードは、セミコロンで区切れば同じ行に書くことができます。
fig04
コンマを使う時と同じように、セミコロンの直前にはスペースを入れず、直後にスペースを入れてください。
if、while、for、class文など、コロンで終わる分の場合の例を見てみましょう。
fig05
このようなコードの場合、print()を呼び出す部分はif文と同じ行に書くことができます。
fig06
しかし、同一行に複数の文を書くことができるからといって、それがよいとは限りません。行が長すぎるコードになって、1行当たりの内容が多すぎて読みにくくなったりします。Blackではこのような文を改行します。
---------------------------------------------------------------

ためしに[print(’What is your name?’); name = input()]を実行してみましたが、問題なく[What is your name?]が返されました。
とはいえ、横に長くなりますので、見にくいと感じる方は増えるように思いました。改行しておくのが無難かもしれません。

import文はどう書くか

さて続いて、import文の記述についても書かれていました。

---------------------------------------------------------------
P.55
同様に、1つのimport文で複数のモジュールをインポートすることもできます。
fig07

PEP8では、モジュールごとに1つのインポート文で書くことを推奨しています。
fig08
インポート用の行を個別に書いておけば、バージョン管理システムのdiffツールで変更点を比較する際に、インポートしたモジュールの追加や削除を簡単に見つけることができます。(中略)
また、PEP8では、インポートの行を次の3グループに分けて、この順に並べることを推奨しています。

  1. Python標準ライブラリーのモジュール(math、os、sysなど)
  2. Selenium、Requests、Djangoなどのサードパーティーモジュール
  3. プログラムの一部であるローカルモジュール

これらのガイドラインは任意であり、Blackがimport文のフォーマットを変更することはありません。
---------------------------------------------------------------

複数モジュールを同時にできるけどやらない方が良いというのは知っていましたが、そんな理由があったんですね。モジュールをインポートする順番については知らなかったので、覚えておきたいと思います!

それではきりが良いので、今回はこちらで終了です。
今回もお付き合いいただきありがとうございました。

 


 

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