複数の戻り値のタイプに注釈を付ける方法は?


110

型ヒントを使用してIterable、常に2つの値aboolとaを生成するを返す関数に注釈を付けるにはどうすればよいstrですか?ヒントTuple[bool, str]は、戻り値の型をジェネレーターや他のタイプの反復可能オブジェクトではなくタプルに制限することを除いて、近いです。

次のようにfoo()複数の値を返すために使用される関数に注釈を付けたいので、私は主に興味があります。

always_a_bool, always_a_str = foo()

通常は(タプルを返す)のfoo()ような関数を実行return a, bしますが、返されるタプルをジェネレーターやリストなどに置き換えるのに十分な柔軟性を備えたタイプヒントが必要です。



3
@ StevenM.Vascellaroこれは、その質問の重複ではありません
TWR Coleの

回答:


158

常に1つのオブジェクトを返します。を使用するreturn one, twoと、タプルが返されます。

そうです、-> Tuple[bool, str]完全に正しいです。

唯一のTupleタイプは、ユーザーが指定することができます固定数の異なるタイプの要素の、それぞれを。関数が固定数の戻り値を生成する場合、特にそれらの値が特定の異なる型である場合は、常にタプルを返す必要があります。

他のシーケンスタイプは、可変数の要素に対して1つのタイプ仕様を持つことが期待されるため、typing.Sequenceここでは適していません。リストとタプルの違い何ですか?も参照してください

タプルは異種のデータ構造です(つまり、それらのエントリは異なる意味を持ちます)が、リストは同種のシーケンスです。タプルには構造があり、リストには順序があります。

Pythonのタイプヒントシステムはその哲学に準拠しており、現在、固定長の反復可能オブジェクトを指定し、特定の位置に特定のタイプを含む構文はありません。

iterableが実行することを指定する必要がある場合、実行できる最善の方法は次のとおりです。

-> Iterable[Union[bool, str]]

この時点で、呼び出し元はブール値と文字列を任意の順序で、長さが不明(0から無限大の間)であると予想できます。


2
言語仕様は、他の反復可能オブジェクトを返すことができます。foo()できるしyield True; yield "blah"a, b = foo()まだ動作します。またはfoo()、リストを返すこともできます。タプルではなく、任意の反復可能をほのめかすことに興味があることを明確にするために、質問を言い換えました。
リチャードハンセン

2
@RichardHansen:Iまし再確認のPEPとの文書typingmypy別の2回の投稿以来。私は何も見逃していなかったとかなり確信しています。そうは言っても、ここSOには、Pythonタイプのヒントの経験が豊富な常連客が何人かいます。間違っていることが判明した場合は、遠慮なく訂正するか、より良い回答を投稿してください。
MartijnPieters

21
from typing import Tupleタプルアノテーションを機能させるには、追加する必要がありました。
PHPirate 2017

3
@PHPirate:はい、とについても同じことをする必要がIterableありUnionます。ここではそれらの特定の使用法について説明しているため、インポートが暗示されます。
MartijnPieters

6
@MartijnPieters、すばらしい回答をありがとうございますが、PHPirateのコメントは元の回答に編集する価値があると思います。
ティムミロノフ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.