Python void戻り型注釈


108

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

def foo() -> str:
    return "bar"

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

私は3つのオプションを考えています:

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

オプション2が私にとって最も論理的だと思われますが、1のインスタンスはすでにいくつか見ました。


11
FWIW、Pythonにはvoid戻り値の型を持つ関数はありません。明示的でない関数(または関数の分岐)returnはを返しNoneます。私はOPがそれを理解していると思います、このコメントは主に将来の読者の利益のためです...
PM 2Ring

さて、この質問は「なぜ関数がPythonでNoneを返すのですか?」ほど一般的ではありません。(私はこの質問を作成しました)したがって、おそらくほとんどの読者はデフォルトの動作をすでに知っています。答えはジレンマ1対2です。しかし、3はどうですか?「プロシージャ」の場合、私は実際にはオプション3を好みますが、無駄な混乱はありません(結局、この関数は何も返しません)。
Tomasz Gandor

@TomaszGandor同意する。関数またはメソッドにreturnステートメントが含まれていない場合、戻り値の型を指定する必要はありません。
ジェイコモン

回答:


121

これは PEP 484 -タイプヒントドキュメント:

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

そして、ご覧のとおり、ほとんどの例はNone戻り値の型として使用しています。


22
明確にするには、上記のオプション1を選択します。
Adam Nelson


12
@asmaierによると、この質問引用PEP 484 -タイプのヒント NoReturnタイプが使用されている「...注釈機能に正常に戻ることはありません例えば、関数は無条件には...例外を発生させること」
ロドリゴラグナ

38

TLDR:void戻り値型注釈の慣用的な同等物は-> Noneです。

def foo() -> None:
    ...

これは、関数の評価結果がにreturn等しいか、またはまったくない場合に一致returnNoneます。

def void_func():  # unannotated void function
    pass

print(void())  # None

戻り値の型を省略しても、戻り値がないとは限りませ。あたりとしてPEP 484

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

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


Pythonの型ヒントは、実際の型を厳密に必要としません。たとえば、注釈はタイプ名の文字列を使用することができUnion[str, int]Union[str, 'int']'Union[str, int]'および様々な変異体が同等です。

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

bar : None

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

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


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

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

--- JukkaL、2018年5月18日


4
3番目のオプションが実際には無効な機能ではない理由を説明するための巨大な一言。
никта
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.