Путаница по поводу виртуальных подклассов при проверке статического типа, например mypyPython

Программы на Python
Ответить
Anonymous
 Путаница по поводу виртуальных подклассов при проверке статического типа, например mypy

Сообщение Anonymous »

Я пытаюсь выяснить в Python, пройдет ли виртуальный подкласс проверку статического типа, как mypy. И я читал об этом на свободном Python:

Виртуальные подклассы не наследуются от своих зарегистрированных ABC и
не проверяются на соответствие ABC. интерфейс в любое время,
даже при их создании. Кроме того, средства проверки статических типов в настоящее время не могут
обрабатывать виртуальные подклассы. Подробности см. в разделе Mypy Issue
2922 — поддержка ABCMeta.register.

Похоже, что mypy не поддерживает виртуальный класс, созданный с помощью Register< /code> или __subclasshool__. Чтобы проверить это, я написал следующий код и получил запутанный результат:

Код: Выделить всё

from collections import abc

class SequenceLike:
def __init__(self, lst):
self._list = list(lst)

def __getitem__(self, index):
return self._list[index]

def __len__(self):
return len(self._list)

def __contains__(self, object):
return object in self._list

def __iter__(self):
return iter(self._list)

def checkSized(a: abc.Sized):
pass

def checkSequence(a: abc.Sequence[int]):
pass

def checkContainer(a: abc.Container):
pass

def checkIterable(a: abc.Iterable):
pass

abc.Sequence.register(SequenceLike)

checkSized(SequenceLike([]))
checkContainer(SequenceLike([1, 2]))
checkIterable(SequenceLike([]))
checkSequence(SequenceLike([1, 2, 3])) # mypy error: Argument 1 to "checkSequence" has incompatible type "SequenceLike"; expected "Sequence[int]"  [arg-type]
Итак, мой вопрос: почему вызовы checkSized(SequenceLike([])), checkContainer(SequenceLike([1, 2])) и checkIterable(SequenceLike([])) не вызывают никаких ошибок mypy, поскольку класс SequenceLike фактически является виртуальным подклассом Sized, Container и Итерируемый?
Я ценю любую помощь или предложения. Спасибо!
Пс. Английский — мой второй язык, поэтому прошу прощения за ошибки в моем вопросе.

Подробнее здесь: https://stackoverflow.com/questions/783 ... -like-mypy
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»