問題解説)PEP 8が推奨する関数アノテーションの使い方について、間違っているものを選択肢の中から選びなさい。

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

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

問題

PEP 8が推奨する関数アノテーションの使い方について、間違っているものを選択肢の中から選びなさい。

  1. アノテーションの直前のコロンの前後には半角スペースを入れる。
  2. 返り値のアノテーションをする場合は、「->」の前後に半角スペースを入れる。
  3. デフォルト値がある引数をアノテーションする場合は、「=」の前後に半角スペースを入れる。
  4. アノテーションがない場合は、デフォルト値を示す「=」の前後にスペースを入れない。

解答のヒント

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開発にも活かしていただけると嬉しいです。

PAGE TOP