У меня есть функция в python, которая может либо вернуть bool
, либо list
. Есть ли способ указать типы возвращаемого типа с помощью подсказок типа.
Например, это правильный способ сделать это?
def foo(id) -> list or bool:
...
У меня есть функция в python, которая может либо вернуть bool
, либо list
. Есть ли способ указать типы возвращаемого типа с помощью подсказок типа.
Например, это правильный способ сделать это?
def foo(id) -> list or bool:
...
Из документации
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.
Оператор 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]