[Pythonクイズ]PEP 8ってちゃんと覚えてますか?(パート3)Pythonステップアップクイズ

PEP 8で推奨されている事柄の中でも基本的なところはやっぱり覚えておきたいですよね。というわけで、皆さんもちゃんと覚えているかどうかチェックしてみましょ?

» 2025年12月23日 05時00分 公開
[かわさきしんじDeep Insider編集部]
「Pythonステップアップクイズ」のインデックス

連載目次

PEP 8で推奨されているのはドレかな? PEP 8で推奨されているのはドレかな?

【問題】

 以下の4つの選択肢の中からPEP 8に沿った記述となっているものを選べ。

  1. 1行の最大文字数は80文字
  2. インデントにはタブ文字ではなく空白文字を使う
  3. トップレベルの関数定義とクラス定義の前後には1行の空行を入れる
  4. 文字列を表す引用符にはシングルクオートもダブルクオートも使えるが、シングルクオートの使用が推奨されている

かわさき

 どうもHPかわさきです。

 先日、Pythonにドネーションしたんです。ドネーション。そしたら(以下略

 というわけで、これまでPythonをネタにいろいろな記事を書いてきたのに、全くそういったことをしていなかったと思いましてドネーションしてみました。というか、python.orgにアクセスしたら「おっす、おらPSF。ドネーションしてくれよな!」みたいにいわれたので、そうしたんですけどね。ソースコードやドキュメントなど、Python本体に何も貢献していなかったので(もちろん、Pythonを使うことも貢献のうちってのは分かっていますが)、ドネーションしたことでちょっとだけ胸を張ってPythonを使えるなって気持ちになりました。


ダジャレをいったのはダジャレ?

 いつも順序が逆になったのは、上で述べた「ドネーション」を題材に、ChatGPT(GPT-5.2)とGemini(Gemini 3の思考モード)、Claude(Opus 4.5)といういつものLLMにダジャレを考えてもらうことにしたからです。

 どんなダジャレを考えてくれるのでしょうか。プロンプトには筆者が考えた「寄付とかしてくれません? どう? お姉ション」というダジャレを例として含めてあります。なるべく失笑できるダジャレを3つのLLMと人間で競ってみました。その結果はいかに……。


【答え】

 正解は選択肢2の「インデントにはタブ文字ではなく空白文字を使う」でした。

インデントを付けるにはタブ文字じゃなくって空白文字を使おう! インデントを付けるにはタブ文字じゃなくって空白文字を使おう!

 選択肢1は「1行の最大文字数は79文字」が推奨されているので間違い。選択肢3は「トップレベルの関数定義とクラス定義の前後には2行の空行を入れる」ことが推奨されているのでやはり間違っています。選択肢4は「PEP 8ではどちらを使うかについて推奨はしない」とされているのでこれも間違いです。

【解説】

 というわけで、選択肢1から順番にもう少し詳しく見ていきましょう。

1行の最大文字数

 PEP 8には「Limit all lines to a maximum of 79 characters」とあります。つまり、1行の最大文字数としては「79文字」が推奨されています。というわけで、最大文字数を「80文字」としている選択肢1は間違いです。ただし、これには幾つかの但し書きが付いている点にも注意してください。

  • 非構造的なテキストブロック:docstringやコメントなどでは72文字を最大文字数とする
  • チーム開発:あるコードが特定のチームでのみ保守されている場合、そのチーム内で合意が取れれば最大で「99文字」までを最大文字数としてもよい。それでもなお、コメントやdocstringはやはり72文字まで
  • Pythonの標準ライブラリでは79文字(コメント類は72文字)が厳守されている

 そもそもなんで「80文字」じゃなくて「79文字」なのかといえば、エディタには改行などを示すマーカーを表示するものがあるからです。このマーカーの分を含めて、最大で80文字になるように、コードは79文字となっています。

 昔のターミナルやコマンドプロンプトでは80文字×25行というサイズが一般的でした。そこで、「1行の最大文字数はマーカー込みで80文字である」とすれば、1行の途中でディスプレイやウィンドウの端を越えて次の行に折り返すようながことが起こらなくなります。つまり、コードが読みやすくなります。これが今でも受け継がれているともいえますが、単純に1行があまりにも長くなり過ぎると、その内容を把握しづらくなるということでしょう。

インデントにはタブ文字ではなく空白文字を使う

 Pythonはコードの構造をインデントで表します。インデントを付けるにはタブ文字と空白文字が使えますが、PEP 8には「Spaces are the preferred indentation method」とあり、空白文字を使ってインデントを付けることが推奨されています。よって、選択肢2の「インデントにはタブ文字ではなく空白文字を使う」はPEP 8に準じた記述です。なお、タブ文字と空白文字を混在させてインデントを付けることは禁止されています(例外が発生します)。

 タブ文字を使ってインデントを付けてよいのは「既存のコードでインデントにタブ文字が使われているときだけ」とされていることにも注意しましょう。インデントに両者を混在させることは禁止されているので、インデントにタブ文字を使っているコードに手を入れるときにはそれに合わせる必要があるくらいに考えておきましょう。

トップレベルの関数定義とクラス定義の前後には1行の空行を入れる

 選択肢3ではトップレベルの関数定義とクラス定義の前後には「1行」の空行を入れるとありますが、PEP 8では「Surround top-level function and class definitions with two blank lines」のように、「2行」の空行を入れることが推奨されているので、選択肢3は間違いです。

 では、メソッド定義はどうかというと、前後に「1行」の空行を入れることが推奨されています。関数定義とクラス定義の前後には2行の空行を入れることで、コード全体を見渡したときに、それらが独立した存在だと目に見えて把握できる一方で、メソッドの前後の空行は1行だけとすることで、メソッドがクラス定義内に含まれていることが明確になるのでしょう。

 ワンライナーの関数を複数定義するようなときには、空行は省略しても構いません。また、関連する関数を複数定義する場合には、それらが関連していることを示すために、関数のグループの前後に追加で空行を入れてもよいとされています。

 なお、関数内での空行に使い方については「Use blank lines in functions, sparingly, to indicate logical sections」とあります。これは「関数内では空行は控えめに使い、論理的なステップの切り替わりを明確にしましょう」といった意味でしょう。無闇矢鱈に空行を使うのではなく、処理やロジックの区切り(ローカル変数の定義、何らかの処理、戻り値の返却など)が明確になるよう、「ご利用は計画的に」ということですね。

シングルクオートとダブルクオートに違いはない

 選択肢4では「文字列を示す文字としてはシングルクオートを使うことが推奨されている」と書きましたが、そんなことはありません。PEP 8には「In Python, single-quoted strings and double-quoted strings are the same. This PEP does not make a recommendation for this」とあります。適当に訳すと「Pythonではシングルクオートを使った文字列とダブルクオートを使った文字列があるが、それらは同じ文字列だ。PEP 8ではどちらを使うかについてオススメはない」とでもなるでしょう。そういうわけで、選択肢4も間違いです。

 1つのソースコード、あるいは特定のプロジェクト内でどちらを使うかを決めておけばどちらを使ってもよいでしょう。ただし、「シングルクオートを含んだ文字列はダブルクオートで囲む」「ダブルクオートを含んだ文字列はシングルクオートで囲む」というのは常に例外的な扱いになるのは、Pythonに慣れた方には当たり前のやり方ですね。


かわさき

 というわけで、3つのLLMが出してきてくれたダジャレを披露します。LLMごとに幾つかの答えから、筆者が2つを失笑候補として選出しています。

  • ChatGPT:「ドネーション? うん、土下座ん…しょん?」「ドネーション、略してドネ。フルネームだとドネ・ーションさん」
  • Gemini:「寄付したら、お礼に大量の塩をもらった。どーね、塩?」「寄付をお願いされて困惑する九州の人。どーねー? しよん?」
  • Claude:「寄付してくれたら、ドネー損はさせません」「この募金箱、ドネーしょんぼりしてるから入れてあげて」

 うん。全部ひどいですね。これに加えて、筆者も以下の2つを候補に入れましょう。

  • HPかわさき:「寄付とかしてくれません? どう? お姉ション」「ドネーションて007的なあれだよね? ショーンドネリー?」

 失笑の度合いを基準に、上の8個の候補から上位3つに5点、3点、1点を与えるものとして3つのLLMに順位を付けてもらいました。

 ChatGPTさんは次の通り。

  1. 「寄付とかしてくれません? どう? お姉ション」(HPかわさき)
  2. 「ドネーションて007的なあれだよね? ショーンドネリー?」(HPかわさき)
  3. 「ドネーション? うん、土下座ん…しょん?」(ChatGPT)

 Geminiさんは次のような順位を付けてくれました。

  1. 「ドネーションて007的なあれだよね? ショーンドネリー?」(HPかわさき)
  2. 「ドネーション? うん、土下座ん…しょん?」(ChatGPT)
  3. 「寄付したら、お礼に大量の塩をもらった。どーね、塩?」(Gemini)

 Claudeさんが付けた順位はこうです。

  1. 「寄付とかしてくれません? どう? お姉ション」(HPかわさき)
  2. 「寄付をお願いされて困惑する九州の人。どーねー? しよん?」(Gemini)
  3. 「ドネーション、略してドネ。フルネームだとドネ・ーションさん」(ChatGPT)

 なんと! HPかわさき(人間)がダジャレの失笑度でLLMを上回りましたよ! ただし、総評とか読むと、「お姉ション」について「ションしかない、その壊れ加減がすごい」みたいな評価が多過ぎて「みんなトークンをちゃんとスキャンしてくれよな!」って思いました。その前の「どう?」と組み合わさって「どう(お)ねえしょん」なんだよ。こっちはそこまで考えていたんだよと思いながら、これが「ショーンドネリー」よりも上の評価になったことに、ちょっとビックリしています。

ネタばらしをされて、全員が同じリアクション(笑) ネタばらしをされて、全員が同じリアクション(笑)

 ショーンドネリーはもちろんショーン・コネリー由来のダジャレですが、それだけではありません。イギリス(北アイルランド)出身のマーティン・ドネリーというF1ドライバーにもインスパイアされたダジャレだったのです。LLMならその辺にも気付いてほしかったですねー。

 まあ、何はともあれ、ダジャレの世界ではまだまだ人間がLLMの上をいけているようで安心しました。

 あ、それから最後にお知らせです。当フォーラム「Deep Insider」がその取り扱う内容をちょっとリニューアルすることになりまして、Pythonステップアップクイズは2026年1月より不定期での公開となります。打ち切り! ではないですよ。不定期という形にはなりますが、またくだらなくって、役に立つかもしれないクイズを皆さんに読んでいただければと思っていますので、来年もよろしくお願いします。


「Pythonステップアップクイズ」のインデックス

Pythonステップアップクイズ

Copyright© Digital Advantage Corp. All Rights Reserved.

アイティメディアからのお知らせ

スポンサーからのお知らせPR

注目のテーマ

人に頼れない今こそ、本音で語るセキュリティ「モダナイズ」
4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。