Ответ 1
У Pycharm есть только предварительная поддержка типов подсказок.
В следующем коде:
from typing import List
def test() -> List[str]:
ret = ["Hi", "Hi"]
return ret
Я получаю следующее предупреждение в строке определения функции:
Expected type 'Integral", got 'str' instead
Я не вижу никакой причины, почему модуль Python IntelliJ-IDEA интерпретирует эту простую функцию как возвращающую список Integral, а не str. Это ошибка проверки типа?
У Pycharm есть только предварительная поддержка типов подсказок.
Обратите внимание, что typing.List
- это простой класс-оболочка, который расширяет встроенный list
класс. Он помогает в типе намека и не позволяет создавать new
список, используя сам.
Вот текущий код для typing.List
:
class List(list, MutableSequence[T], extra=list):
__slots__ = ()
def __new__(cls, *args, **kwds):
if _geqv(cls, List):
raise TypeError("Type List cannot be instantiated; "
"use list() instead")
return _generic_new(list, cls, *args, **kwds)
Выполняя typing.List[str]
, вы пытаетесь вызвать метод __getitem__
для объекта typing.List
(который является типом). Также обратите внимание, что
Это означает, что:
typing.List.__getitem__(str)
# or
list.__getitem__(str)
Теперь, если вы видите, что ожидает метод индексации списка, он ожидает целое число, подобное a[0], a[1]
. В этом случае вместо int
, как 0, 1
, он получил тип str
Надеюсь, это даст вам более целостное представление о typing.List
.