問題解説)PEP 8で推奨されるコードの書き方として、間違っているものを次の選択肢の中から選びなさい。

当コラムでは、PythonZen & PEP 8 検定試験(無料で受験できます)(こちらでオンライン受験できます)で出題されている問題の解説を行なっています。当コラムシリーズを読んで自信がついたら、ぜひ試験に挑戦してみてくださいね。

今回のコラムで解説する試験問題はこちらです。

問題

PEP 8で推奨されるコードの書き方として、間違っているものを次の選択肢の中から選びなさい。

  1. 文字列の連結をする場合は、a += ba = a + b のような書き方はしないこと。
  2. None のようなシングルトンを比較をする場合は、等値演算子を使う。
  3. if x is not None と書く代わりに、if x と書くことは非推奨である。
  4. 読みやすさのため、not ... is ... ではなく、 is not 演算子を使うようにする。

解答のヒント

PEP 8の「プログラミングの推奨事項」(Programming Recommendations)が問題の範囲になっています。

Code should be written in a way that does not disadvantage other implementations of Python (PyPy, Jython, IronPython, Cython, Psyco, and such).

For example, do not rely on CPython’s efficient implementation of in-place string concatenation for statements in the form a += b or a = a + b. This optimization is fragile even in CPython (it only works for some types) and isn’t present at all in implementations that don’t use refcounting. In performance sensitive parts of the library, the ”.join() form should be used instead. This will ensure that concatenation occurs in linear time across various implementations.

コードはPythonの他の実装(PyPy、Jython、IronPython、Cython、Psycoなど)に不利にならないように書くべきです。

例えば、a += ba = a + b のような形のステートメントを書いて、CPythonのインプレースで効率的な文字列結合の実装に頼ってはいけません。この最適化はCPythonでも不安定で(いくつかの型でしか機能しません)、参照カウント機能を使っていない実装では全く最適化されていません。ライブラリ内のパフォーマンスに敏感な部分では、代わりに ''.join() 形式を使うべきです。こうすることで、様々な実装において結合処理にかかる時間が比例時間で済むようになります。

Comparisons to singletons like None should always be done with is or is not, never the equality operators.

Also, beware of writing if x when you really mean if x is not None – e.g. when testing whether a variable or argument that defaults to None was set to some other value. The other value might have a type (such as a container) that could be false in a boolean context!

Noneのようなシングルトンとの比較は、常に isis not で行うべきで、決して等号演算子を使うべきではありません。

また、if x is not None という意味で if x と記述する場合にも注意が必要です。例えば、デフォルトでNoneに設定されている変数や引数に他の値がセットされているかどうかをテストする場合などです。なぜなら、他の値は、真偽値に直すとfalseになりうる型(コンテナなど)かもしれないからです!

Use is not operator rather than not … is. While both expressions are functionally identical, the former is more readable and preferred:

not ... is よりも is not 演算子を使いましょう。どちらの表現も機能的には同じですが、前者の方が読みやすく、好まれます。

ガイドラインには具体的なサンプルコードも載っていますので、併せて確認しておきましょう。

正解はこちら

ガイドラインには、ルールとして従わなくてはいけないこと(must)、推奨されること(should)、各ルールの適用例・非適用例(cases)が書いてあります。ルールを機械的に覚えるだけではなく、なぜこのルールがあるのかを意識していくと、理解が深まりますね。

自信がついてきたら PythonZen & PEP 8 検定試験 で実際に試験を受けて、正解を当ててみましょう。

そして、みなさんのPython開発にも活かしていただけると嬉しいです。

PAGE TOP