Я недавно обнаружил mypy и хочу, чтобы мой код проверялся с его помощью.
У меня базовый класс Something
:
class Something():
... something...
И у меня есть несколько подклассов, все они экземпляры Something
, но разных типов:
class Thing(Something)
def __init__():
short_name = "S"
class OtherThing(Something)
def __init__():
short_name = "T"
Когда я использую эти объекты, я обычно помещаю их в список:
s1 = Thing()
s2 = OtherThing()
list_things: List[Something] = list()
list_things.append(s1)
list_things.append(s2)
Но, видимо, я не могу этого сделать, mypy не распознает Thing и OtherThing как «низшие типы» чего-то.
Как мне это исправить?
Проверить Проблема с Github
Как видно там и в официальных документах, это как задумано
И как обходной путь, цитируя Комментарий JukkaL на github:
You can often use
Sequence[x]
instead ofList[x]
to get code like your example working. This works becauseSequence
is covariant and doesn't let you set items in the list, unlikeList[x]
which is invariant and allows the mutation of the list.
В комментарии также говорится: «Если ваша функция на самом деле не изменяет список, вы можете обойти эту ошибку, набрав вместо этого аргумент как Sequence [Base] или даже Iterable [Base].». Моя действительно изменяет список.
Я понимаю. может быть, тогда постарайтесь избежать изменения списка. Я не связан с mypy
, но, как я вижу, у вас нет другого выбора
Mypy на самом деле без проблем проверяет тип предоставленного вами кода. Вам следует отредактировать свой пост и убедиться, что ваш пример действительно демонстрирует проблему, с которой вы столкнулись.