Return None из функции python, аннотированной mypy, несколько возвращаемых типов

Я родом из машинописного фона. Я использую проверку статического типа в проекте Python, над которым я работаю (используя mypy).

В Typescript допустимо возвращать null из аннотированной функции, чтобы вернуть что-то еще, то есть строку:

function test(flag: boolean): string {
    if (flag) {
        return 'success';
    } else {
        return null;
    }
}

Также допустимо аннотировать вашу функцию, чтобы она имела несколько потенциальных возвращаемых типов, то есть строковое или логическое:

function test(flag: boolean): string | boolean {
    if (flag) {
        return 'success';
    } else {
        return false;
    }
}

Но в python, использующем mypy, мне запрещено возвращать None из функции, которая аннотирована для возврата str.

def test(flag: bool) -> str:
    if flag:
        return 'success'
    else:
        return None
        # [mypy] error:Incompatible return value type (got "None", expected "str")

Кроме того, я не вижу способа аннотировать несколько возвращаемых типов, например str | None.

Как мне подойти к чему-то подобному с помощью mypy? Функции, которые не возвращают None из состояния ошибки, используются по всей моей кодовой базе.

Не могли бы вы вместо этого просто вернуть пустую строку?

K-Log 10.09.2018 21:26

Это логично: в Python None не является «нулевой ссылкой», это объект (как и любой другой объект), и его тип - NoneType.

Willem Van Onsem 10.09.2018 21:35

@WillemVanOnsem да, имеет смысл, что тип None в python отличается от нулевой ссылки в javascript.

Corey Cole 10.09.2018 21:50
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
17
3
6 854
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я нашел то, чего мне не хватало в документации, благодаря @zsol на mypy gitter!

Две полезные функции mypy - это типы Optional и Union, которые можно импортировать из модуля набора текста python. Документация здесь.

Если вы хотите отметить, что функция потенциально может возвращать None в дополнение к основному типу, например str, используйте Optional:

from typing import Optional

def test(flag: bool) -> Optional[str]:
    if flag:
        return 'success'
    else:
        return None

Если вы хотите отметить, что функция потенциально может возвращать несколько типов, например str | bool, используйте Union:

from typing import Union

def test(flag: bool) -> Union[str, bool]:
    if flag:
        return 'success'
    else:
        return False

Другие вопросы по теме