Подтвердить что ты не робот

Как указать несколько типов возврата с помощью типов-подсказок

У меня есть функция в python, которая может либо вернуть bool, либо list. Есть ли способ указать типы возвращаемого типа с помощью подсказок типа.

Например, это правильный способ сделать это?

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

Ответ 1

Из документации

class typing.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.

Ответ 2

Оператор def foo(client_id: str) → list or bool: при оценке эквивалентен def foo(client_id: str) → list: и поэтому не будет делать то, что вы хотите.

Родной способ описать подсказку типа "либо А, либо В" - это Union (спасибо Бхаргаву Рао):

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

Я не хочу быть парнем из "Почему ты так хочешь", но, возможно, иметь 2 типа возврата не то, что ты хочешь:

Если вы хотите вернуть bool для указания какого-либо особого случая ошибки, рассмотрите возможность использования исключений. Если вы хотите вернуть bool как какое-то специальное значение, возможно, пустой список будет хорошим представлением. Вы также можете указать, что None может быть возвращено с помощью Optional[list]