python 3.xでは、次のような関数の戻り値の注釈を使用するのが一般的です。
_def foo() -> str:
return "bar"
_
「void」タイプの正しい注釈は何ですか?
私は3つのオプションを検討しています:
def foo() -> None:
None
はタイプではないため、def foo() -> type(None):
NoneType
を取得するために知っている最良の構文を使用して、def foo():
オプション2は私にとって最も論理的なように見えますが、1のいくつかのインスタンスを見てきました。
これは PEP 484-タイプヒント ドキュメンテーションから直接です:
型ヒントで使用される場合、式
None
はtype(None)
と同等と見なされます。
そして、あなたが見ることができるように、ほとんどの例は戻り型としてNone
を使用します。
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はNone
がtype(None)
を意味すると示唆していますが、するべきではない後者の形式を明示的に使用してください。型ヒント仕様はnotにtype(...)
の形式を含めます。これは技術的にはランタイム式であり、そのサポートは完全に型チェッカー次第です。 mypy
プロジェクトは サポートを削除することを考慮type(None)
であり、484からも削除します。
または、
type(None)
がタイプとして有効であり、None
のみが正しいスペルであることを示唆しないようにPEP 484を更新する必要がありますか?それを行うための明白な方法は1つ、できれば1つだけである必要があります。
「Xのタイプ」の静的な同等物はType[X]
です。これはNone
にも有効です:
def foo() -> Type[None]:
pass
ただし、基本的にはType[True]
と同等であり、類似しています。 1つの特別なケース(タイプではなく値の使用)を別の特別なケース(値から派生したタイプの使用)で排除します。慣用的な特殊なケースは、None
を使用することです。
戻り値の型を省略すると、notは戻り値がないことを意味します。 PEP 484 :
チェックされた関数の場合、引数と戻り値の型のデフォルトの注釈は
Any
です。
これは、値が動的に型付けされ、静的に考慮されることを意味します すべての操作をサポートします 。これは、実質的にvoid
の反対の意味です。