PEP 8で推奨されている事柄の中でも基本的なところはやっぱり覚えておきたいですよね。というわけで、皆さんもちゃんと覚えているかどうかチェックしてみましょ?
以下の4つの選択肢の中からPEP 8に沿った記述となっているものを選べ。
どうも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から順番にもう少し詳しく見ていきましょう。
PEP 8には「Limit all lines to a maximum of 79 characters」とあります。つまり、1行の最大文字数としては「79文字」が推奨されています。というわけで、最大文字数を「80文字」としている選択肢1は間違いです。ただし、これには幾つかの但し書きが付いている点にも注意してください。
そもそもなんで「80文字」じゃなくて「79文字」なのかといえば、エディタには改行などを示すマーカーを表示するものがあるからです。このマーカーの分を含めて、最大で80文字になるように、コードは79文字となっています。
昔のターミナルやコマンドプロンプトでは80文字×25行というサイズが一般的でした。そこで、「1行の最大文字数はマーカー込みで80文字である」とすれば、1行の途中でディスプレイやウィンドウの端を越えて次の行に折り返すようながことが起こらなくなります。つまり、コードが読みやすくなります。これが今でも受け継がれているともいえますが、単純に1行があまりにも長くなり過ぎると、その内容を把握しづらくなるということでしょう。
Pythonはコードの構造をインデントで表します。インデントを付けるにはタブ文字と空白文字が使えますが、PEP 8には「Spaces are the preferred indentation method」とあり、空白文字を使ってインデントを付けることが推奨されています。よって、選択肢2の「インデントにはタブ文字ではなく空白文字を使う」はPEP 8に準じた記述です。なお、タブ文字と空白文字を混在させてインデントを付けることは禁止されています(例外が発生します)。
タブ文字を使ってインデントを付けてよいのは「既存のコードでインデントにタブ文字が使われているときだけ」とされていることにも注意しましょう。インデントに両者を混在させることは禁止されているので、インデントにタブ文字を使っているコードに手を入れるときにはそれに合わせる必要があるくらいに考えておきましょう。
選択肢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つを失笑候補として選出しています。
うん。全部ひどいですね。これに加えて、筆者も以下の2つを候補に入れましょう。
失笑の度合いを基準に、上の8個の候補から上位3つに5点、3点、1点を与えるものとして3つのLLMに順位を付けてもらいました。
ChatGPTさんは次の通り。
Geminiさんは次のような順位を付けてくれました。
Claudeさんが付けた順位はこうです。
なんと! HPかわさき(人間)がダジャレの失笑度でLLMを上回りましたよ! ただし、総評とか読むと、「お姉ション」について「ションしかない、その壊れ加減がすごい」みたいな評価が多過ぎて「みんなトークンをちゃんとスキャンしてくれよな!」って思いました。その前の「どう?」と組み合わさって「どう(お)ねえしょん」なんだよ。こっちはそこまで考えていたんだよと思いながら、これが「ショーンドネリー」よりも上の評価になったことに、ちょっとビックリしています。
ショーンドネリーはもちろんショーン・コネリー由来のダジャレですが、それだけではありません。イギリス(北アイルランド)出身のマーティン・ドネリーというF1ドライバーにもインスパイアされたダジャレだったのです。LLMならその辺にも気付いてほしかったですねー。
まあ、何はともあれ、ダジャレの世界ではまだまだ人間がLLMの上をいけているようで安心しました。
あ、それから最後にお知らせです。当フォーラム「Deep Insider」がその取り扱う内容をちょっとリニューアルすることになりまして、Pythonステップアップクイズは2026年1月より不定期での公開となります。打ち切り! ではないですよ。不定期という形にはなりますが、またくだらなくって、役に立つかもしれないクイズを皆さんに読んでいただければと思っていますので、来年もよろしくお願いします。
Copyright© Digital Advantage Corp. All Rights Reserved.