Проверка типа PyCharm не работает должным образом

ИЗМЕНИТЬ

Согласно ответу @Jim Fasarakis Hilliard, я понимаю, что это не ошибка, а ожидаемое поведение. Итак, я хотел бы добавить к вопросу - могу ли я каким-то образом заставить mypys --strict-optional-подобную функциональность в проверке типов PyCharm?


После просмотра пары видео о проверке типов в Python 3.5+ и Pycharm я подумал, что это должно быть помечено как неправильный возвращаемый тип:

from typing import Optional, List
import random

def r() -> Optional[List[int]]:
    if random.choice([0, 1]):
        return [1, 2, 3]
    return None


def f() -> List[int]:
    return r()

введите здесь описание изображения

Функция f() может возвращать либо list из ints, либо None, что указано явно, но PyCharm не помечает return r() как неверный результат.

def f() -> List[int]:
    return None

введите здесь описание изображения

Например, если функция f() выглядит так, как показано выше, PyCharm обнаруживает неправильный тип return.

Это баг или нужно было изменить какие-то настройки? Я увеличил серьезность проверки типов до error.


person Milano    schedule 13.04.2018    source источник


Ответы (1)


Средство проверки типов PyCharm, вероятно, обрабатывает None так же, как mypy, см.: types" rel="nofollow noreferrer">Тип None и необязательные типы (по крайней мере, в данном случае это так.)

По той же причине следующий тип функции проверяет как в mypy (0.580), так и в PyCharm (сборка 173.4301.16):

def foo(x: Optional[int]) -> int:
    return x + 2

Я полагаю, это можно назвать ошибкой? В любом случае mypy предлагает флаг --strict-optional. чтобы обработать их, и при использовании ваша исходная ошибка будет обнаружена:

error: Incompatible return value type (got "Optional[List[int]]", expected "List[int]")

этот флаг будет использоваться по умолчанию в будущих выпусках в соответствии с документацией mypy. Я бы с уверенностью предположил, что PyCharm в какой-то момент последует этому примеру, хотя я не могу найти никакой соответствующей информации в их документация по подсказкам типов.

person Dimitris Fasarakis Hilliard    schedule 13.04.2018
comment
Спасибо, а в PyCharm еще нет такой опции? Мне гораздо удобнее, чем mypy. - person Milano; 13.04.2018
comment
@MilanoSlesarik Я понимаю. К сожалению, я не могу найти документацию по проверке типов PyCharm, поэтому я не уверен в каких-либо специальных флагах, которые она может выставить. - person Dimitris Fasarakis Hilliard; 14.04.2018
comment
Эта проблема отслеживается в PY-24834 PyCharm. - person ldrg; 17.07.2019