1. ホーム
  2. パイソン

[解決済み】複数の戻り値を持つ型にアノテーションを付けるには?

2022-04-05 19:24:18

質問

を返す関数にアノテーションを付けるには、どのようにタイプヒントを使用すればよいですか? Iterable という2つの値を常に生成します。 boolstr ? ヒントは Tuple[bool, str] は近いですが、戻り値の型をジェネレータや他の反復可能な型ではなく、タプルに限定していることを除けば、です。

というのも、ある関数にアノテーションを付けたいからです。 foo() このように複数の値を返すために使用されます。

always_a_bool, always_a_str = foo()

通常、以下のような関数は foo() のようなことをします。 return a, b (これはタプルを返します) しかし、私は型ヒントに、返されたタプルをジェネレータやリストや他のものに置き換えるのに十分な柔軟性が欲しいのです。

どのように解決するのですか?

いつも 1 オブジェクトを使用します。 return one, two は単にタプルを返します。

そうそう。 -> Tuple[bool, str] は全くもって正しい。

のみです。 その Tuple タイプでは 定数 の要素で、それぞれが明確な型を持っています。を生成する場合は、常にタプルを返さなければなりません。 固定 特に、それらの値が特定の、異なる型である場合、戻り値の数。

その他のシーケンス型には 一つ の型指定は、可変数の要素に対して行われるので typing.Sequence はここでは適さない。また リストとタプルの違いは何ですか?

<ブロッククオート

タプルは異種データ構造(項目が異なる意味を持つ)であるのに対し、リストは同種のシーケンスです。 タプルには構造があり、リストには順序がある。

Pythonの型ヒントシステムはその哲学に忠実で、固定長で特定の位置に特定の型を含む反復可能を指定する構文は今のところありません。

もし、あなたが が必要です。 は、どんなイテラブルでもよいという指定であれば、ベストなのは

-> Iterable[Union[bool, str]]

この時点で、呼び出し元はブーリアンや文字列を期待することができます。 任意の順序で また、長さは0から無限大の間です。

最後になりましたが、Python3.9では

-> tuple[bool, str]

の代わりに -> Tuple[bool, str] タイプヒンティング表記をサポート は、ほとんどの標準ライブラリコンテナタイプに追加されました。 (参照 PEP 585 をご覧ください。) 実際、Python 3.7 の時点でも from __future__ import annotations コンパイラスイッチと、この構文をサポートするタイプチェッカを使用してください。