Возвратите None из функции python, аннотированной с помощью mypy, несколько типов возврата - PullRequest
0 голосов
/ 10 сентября 2018

Я пришел из фона Typescript и перенес статическую проверку типов в проект 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 из состояния ошибки, находятся по всей моей кодовой базе.

1 Ответ

0 голосов
/ 10 сентября 2018

Хорошо, я нашел то, что мне не хватало в документации, благодаря @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;
    }
}
...