当コラムでは、PythonZen & PEP 8 検定試験(こちらでオンライン受験できます)で出題されている問題の解説を行なっています。当コラムシリーズを読んで自信がついたら、ぜひ試験に挑戦してみてくださいね。
今回のコラムで解説する試験問題はこちらです。
問題
PEP 8が推奨する関数アノテーションの使い方について、間違っているものを選択肢の中から選びなさい。
- アノテーションの直前のコロンの前後には半角スペースを入れる。
- 返り値のアノテーションをする場合は、「->」の前後に半角スペースを入れる。
- デフォルト値がある引数をアノテーションする場合は、「=」の前後に半角スペースを入れる。
- アノテーションがない場合は、デフォルト値を示す「=」の前後にスペースを入れない。
解答のヒント
PEP 8「式と文における空白」(Whitespace in Expressions and Statements )の「その他の推奨事項」(Other Recommendations)が今回の問題の範囲になっています。
関数のアノテーションでは通常のコロンのルールを使用します。->
矢印がある場合は、その前後に常に空白を入れる必要があります。
Function annotations should use the normal rules for colons and always have spaces around the -> arrow if present.
# Correct: def munge(input: AnyStr): ... def munge() -> PosInt: ...
# Wrong: def munge(input:AnyStr): ... def munge()->PosInt: ...
「通常のコロンのルール」とは、カンマ・セミコロン・コロンの直前では余分な空白を避ける、というルールです。1つ前のセクションに記載されています。
Avoid extraneous whitespace in the following situations:
…
Immediately before a comma, semicolon, or colon:# Correct: if x == 4: print(x, y); x, y = y, x
# Wrong: if x == 4 : print(x , y) ; x , y = y , x
キーワード引数を示す場合や、アノテーションのない関数パラメータのデフォルト値を示す場合には、=
記号の前後にスペースを使用しません。
Don’t use spaces around the = sign when used to indicate a keyword argument, or when used to indicate a default value for an unannotated function parameter:
# Correct: def complex(real, imag=0.0): return magic(r=real, i=imag)
# Wrong: def complex(real, imag = 0.0): return magic(r = real, i = imag)
しかし、引数アノテーションとデフォルト値を組み合わせる場合は、=
記号の前後に空白を使用します。
When combining an argument annotation with a default value, however, do use spaces around the = sign:
# Correct: def munge(sep: AnyStr = None): ... def munge(input: AnyStr, sep: AnyStr = None, limit=1000): ...
# Wrong: def munge(input: AnyStr=None): ... def munge(input: AnyStr, limit = 1000): ...
以上のガイドラインを読んで、正解を導けましたでしょうか?
ガイドラインには具体的なサンプルコードも載っていますので、併せて確認しておきましょう。
正解はこちら
ガイドラインには、ルールとして従わなくてはいけないこと(must)、推奨されること(should)、各ルールの適用例・非適用例(cases)が書いてあります。ルールを機械的に覚えるだけではなく、なぜこのルールがあるのかを意識していくと、理解が深まりますね。
自信がついてきたら PythonZen & PEP 8 検定試験 で実際に試験を受けて、正解を当ててみましょう。
そして、みなさんのPython開発にも活かしていただけると嬉しいです。