Я родом из машинописного фона. Я использую проверку статического типа в проекте 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 из состояния ошибки, используются по всей моей кодовой базе.
Это логично: в Python None не является «нулевой ссылкой», это объект (как и любой другой объект), и его тип - NoneType.
@WillemVanOnsem да, имеет смысл, что тип None в python отличается от нулевой ссылки в javascript.






Хорошо, я нашел то, чего мне не хватало в документации, благодаря @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
Не могли бы вы вместо этого просто вернуть пустую строку?