Как указать несколько типов возврата, используя подсказки типа


205

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

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

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

5
как получается список или логическое значение?
Падрайк Каннингем

11
@PadraicCunningham Возможно, реализация заключается в том, что я пришлю вам мой идентификатор, вы отправите мне список или логическое значение : D
Бхаргав Рао

Вероятно, это слабая реализация
Славомир Ленарт

@PadraicCunningham Полиморфизм. Если ваша функция выполняет проверку входных данных, что бы это ни было, вы хотите получить логическое значение, когда вы передаете одну переменную, или получить список логических значений, когда вы передаете список переменных.
Гимут

Ответы:


282

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

класс 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 .


Есть ли эквивалент в Python 3.4
Яхья Уддин

1
@YahyaUddin Нету - PEP 484 : '(.... Это только для Python3.5 и выше.
Бхаргав Рао

1
@YahyaUddin Довольно удивительно. Вы имели в виду аннотации функций случайно?
Бхаргав Рао

2
Так что дай мне посмотреть, получил ли я это. В Python 3.4 есть аннотации функций, которые не делают ничего, кроме аннотирования, которое НЕ является обязательным. Но в Python 3.5 это фактическая проверка типов.
Яхья Уддин

1
@BhargavRao, извините за это! Я просто чувствовал, что это слишком важно, чтобы оставить в разделе комментариев.
Боборт

26

Утверждение 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]


6
Есть случаи, когда возвращение нескольких типов может быть тем, что вам нужно: например, если вам нужно вернуть один из некоторого набора подтипов, но не других подтипов, или если вы пытаетесь обработать данные и хотите вернуть необработанную форму, если обработка не выполняется. не доступно Кроме того, если вы переносите устаревший код, он может быть весьма полезен, потому что он помогает процессу обновления и / или видит неудобные места.
Натаниэль Форд

Исключения и идея пустого списка также были полезны. спасибо
Яхья Уддин

20

Если кто-то приземлился здесь в поисках «как указать типы множественных возвращаемых значений?», Используйте Tuple[type_value1, ..., type_valueN]

from typing import Tuple

def f() -> Tuple[dict, str]:
    a = {1: 2}
    b = "hello"
    return a, b

Больше информации: https://code-examples.net/en/q/2651e60

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.