タイプヒントを使用して複数の戻り値の型を指定する方法


205

Pythonでa boolまたはを返すことができる関数がありますlist。型ヒントを使用して戻り値の型を指定する方法はありますか?

たとえば、これは正しい方法ですか?

def foo(id) -> list or bool:
      ...

5
どのようにしてリストまたはブール値になるのですか?
Padraic Cunningham

11
@PadraicCunningham多分実装は私があなたに私のIDを送るでしょう、あなたは私にリストかブール値のいずれかを送ってくれます:D
Bhargav Rao

おそらく弱い実装であること
SławomirLenart

@PadraicCunninghamポリモーフィズム。関数が入力のチェックを実行する場合、それが何であれ、1つの変数をフィードするときにブール値を取得するか、変数のリストをフィードするときにブール値のリストを取得します。
ギムート

回答:


282

ドキュメントから

クラス typing.Union

ユニオンタイプ。Union [X、Y]はXまたはYを意味します。

したがって、複数の戻りデータ型を表す適切な方法は次のとおりです。

from typing import Union


def foo(client_id: str) -> Union[list,bool]

ただし、タイピングは強制されないことに注意してください。Pythonは引き続き動的型付け言語のままです。アノテーション構文は、本番環境にリリースされる前のコードの開発中に役立つように開発されました。PEP 484で述べられているように、「実行時に型チェックは行われません」。

>>> def foo(a:str) -> list:
...     return("Works")
... 
>>> foo(1)
'Works'

ご覧のとおり、int値を渡してstrを返しています。ただし、__annotations__はそれぞれの値に設定されます。

>>> foo.__annotations__ 
{'return': <class 'list'>, 'a': <class 'str'>}

タイプヒントの詳細については、PEP 483を参照してください。「Python 3.5のタイプヒントとは」も参照してください。

これはPython 3.5以降でのみ利用可能です。これはPEP 484で明確に述べられています。


Python 3.4に同等のものはありますか
Yahya Uddin 2015年

1
@YahyaUddinいや- PEP 484: '(....それは上向きにのみPython3.5のためです。
Bhargavラオ

1
@YahyaUddinかなり意外です。たまたま関数注釈という意味ですか?
Bhargav Rao

2
だから私がこれを得たかどうか見てみましょう。Python 3.4には、強制されない注釈以外に何もしない関数注釈があります。しかし、Python 3.5では、これは実際の型チェックです。
Yahya Uddin 2015年

1
@BhargavRao、ごめんなさい!コメント欄に残すのはあまりにも重要だと思っただけです。
Bobort 2017

26

def foo(client_id: str) -> list or bool:評価されたときのステートメントは同等で def foo(client_id: str) -> list:あり、したがって、期待どおりに動作しません。

「AまたはB」タイプのヒントを表すネイティブな方法は、Unionです(Bhargav Raoに感謝):

def foo(client_id: str) -> Union[list, bool]:

私は「なぜとにかくこれをしたいのか」という人にはなりたくありませんが、おそらく2つの戻り値の型を持つことは、あなたが望むものではありません。

あるタイプの特殊なエラーケースを示すブール値を返したい場合は、代わりに例外を使用することを検討してください。特別な値としてブール値を返したい場合、おそらく空のリストが適切な表現になります。Noneで返すことができることを示すこともできますOptional[list]


6
複数のタイプを返すことが望ましい場合がある用途があります。たとえば、サブタイプのセットの1つを返し、他のサブタイプは必要ない場合、またはデータを処理しようとしていて、処理が行われていない場合は未加工のフォームを返したい場合などです。利用できません。また、レガシーコードをラップしている場合は、アップグレードプロセスや厄介な場所の確認に役立つため、非常に便利です。
Nathaniel Ford

例外と空のリストのアイデアも役に立ちました。ありがとう
Yahya Uddin 2015年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.