web-dev-qa-db-ja.com

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

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

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

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

ドキュメント から

クラス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 48 をご覧ください。 Python 3.5のタイプヒントとは ?も参照してください。

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

188
Bhargav Rao

ステートメントdef foo(client_id: str) -> list or bool:は、評価されたときにdef foo(client_id: str) -> list:と同等であるため、必要な処理を行いません。

「AまたはBのいずれか」タイプのヒントを記述するネイティブな方法は、 nion (Bhargav Raoに感謝)です。

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

「とにかくこれをやりたいのはなぜですか」という男にはなりたくありませんが、2つの戻り値の型を持つことは望みではありません。

何らかの特殊なエラーケースを示すブール値を返したい場合は、代わりに例外の使用を検討してください。 boolを特別な値として返したい場合は、空のリストが適切な表現である可能性があります。 NoneOptional[list]で返されることを示すこともできます

16
Felk