web-dev-qa-db-ja.com

Python void return typeアノテーション

python 3.xでは、次のような関数の戻り値の注釈を使用するのが一般的です。

_def foo() -> str:
    return "bar"
_

「void」タイプの正しい注釈は何ですか?

私は3つのオプションを検討しています:

  1. def foo() -> None:
    • 論理IMOではありません。Noneはタイプではないため、
  2. def foo() -> type(None):
    • NoneTypeを取得するために知っている最良の構文を使用して、
  3. def foo():
    • 明示的な戻り型情報を省略します。

オプション2は私にとって最も論理的なように見えますが、1のいくつかのインスタンスを見てきました。

54
Tregoreg

これは PEP 484-タイプヒント ドキュメンテーションから直接です:

型ヒントで使用される場合、式Nonetype(None)と同等と見なされます。

そして、あなたが見ることができるように、ほとんどの例は戻り型としてNoneを使用します。

65
AKS

TLDR:void戻り型アノテーションの慣用的な同等物は-> Noneです。

def foo() -> None:
    pass

Pythonのタイプヒンティングは厳密に実際のタイプを必要としません。たとえば、アノテーションはタイプ名の文字列を使用できます:Union[str, int]Union[str, 'int']'Union[str, int]'およびさまざまなバリアントは同等です。

同様に、タイプ注釈Noneは、意味する "is of NoneType"と見なされます。これは戻り値の型だけでなく使用できますが、最も頻繁に使用されます。

bar : None

def foo(baz: None) -> None:
    return None

これは、ジェネリック型にも適用されます。たとえば、Generator[int, None, None]Noneを使用して、ジェネレーターが値を取得または返さないことを示すことができます。


PEP 484はNonetype(None)を意味すると示唆していますが、するべきではない後者の形式を明示的に使用してください。型ヒント仕様はnottype(...)の形式を含めます。これは技術的にはランタイム式であり、そのサポートは完全に型チェッカー次第です。 mypyプロジェクトは サポートを削除することを考慮type(None)であり、484からも削除します。

または、type(None)がタイプとして有効であり、Noneのみが正しいスペルであることを示唆しないようにPEP 484を更新する必要がありますか?それを行うための明白な方法は1つ、できれば1つだけである必要があります。

--- JukkaL、2018年5月18日

「Xのタイプ」の静的な同等物はType[X]です。これはNoneにも有効です:

def foo() -> Type[None]:
    pass

ただし、基本的にはType[True]と同等であり、類似しています。 1つの特別なケース(タイプではなく値の使用)を別の特別なケース(値から派生したタイプの使用)で排除します。慣用的な特殊なケースは、Noneを使用することです。


戻り値の型を省略すると、notは戻り値がないことを意味します。 PEP 484

チェックされた関数の場合、引数と戻り値の型のデフォルトの注釈はAnyです。

これは、値が動的に型付けされ、静的に考慮されることを意味します すべての操作をサポートします 。これは、実質的にvoidの反対の意味です。

6
MisterMiyagi