Як вказати кілька типів повернення за допомогою підказки типу


204

У мене є функція python, яка може повернути boolабо a list. Чи є спосіб вказати типи повернення, використовуючи підказки типу.

Наприклад, чи правильно це зробити?

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

5
як ви закінчуєте або список, або булевий?
Padraic Cunningham

11
@PadraicCunningham Можливо, реалізація полягає в тому, що я надішлю вам свій ідентифікатор, ви надішліть мені або список, або булевий : D
Bhargav Rao

Мабуть, це слабке виконання
Славомір Ленарт

@PadraicCunningham Поліморфізм. Якщо ваша функція виконує перевірку на вході, яким би він не був, ви хочете отримати булевий сигнал, коли ви подаєте одну змінну або отримуєте список булевих, коли ви подаєте список змінних.
Гімуте

Відповіді:


281

З документації

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

1
@YahyaUddin Nope - PEP 484 : '(.... Це лише для Python3.5 вгору.
Bhargav Rao

1
@YahyaUddin Досить дивно. Ви мали на увазі випадково функціональні анотації ?
Bhargav Rao

2
Тож дайте мені побачити, чи отримав я це. Python 3.4 має функції приміток, які не роблять нічого іншого, крім приміток, які НЕ виконуються. Але в Python 3.5 це фактична перевірка типу.
Ях’я Уддін

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

26

Заява, що def foo(client_id: str) -> list or bool:оцінюється, еквівалентна def foo(client_id: str) -> list:і тому не буде робити те, що ви хочете.

Нативним способом описати натяк типу "А чи Б" є Союз (завдяки Bhargav Rao):

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

Я не хочу бути хлопцем "Чому ти все одно хочеш це робити", але, можливо, мати два типи повернення - це не те, що ти хочеш:

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


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

Також була корисна ідея винятків та порожнього списку. спасибі
Yahya Uddin

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/uk/q/2651e60

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.