Использование typing.assert_never () с абстрактными базовыми классами, чтобы обеспечить полное покрытиеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Использование typing.assert_never () с абстрактными базовыми классами, чтобы обеспечить полное покрытие

Сообщение Anonymous »

У меня есть абстрактный базовый класс parsernode , с кучей конкретных подклассов (

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

StartTag
, rawtext и т. Д.).
У меня есть функция, которая принимает парсинод и делает разные вещи, основываясь на том, какой это подтип. Я хотел бы убедиться, что Mypy будет жаловаться, если я когда-нибудь добавлю новый подкласс Parsernode , не изменяя эту функцию, чтобы обрабатывать новый тип.

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

import typing

def doTheThing(node: ParserNode) -> None:
if isinstance(node, StartTag):
...
elif isinstance(node, RawText):
...
else:
typing.assert_never(node)
Однако это не работает - Mypy сразу же жалуется, что я не обращаюсь к типу Parsernode . Но это абстрактный базовый класс, объявленный с помощью meta = abcmeta и с помощью @abstractmethod , поэтому для переменной невозможно иметь это в качестве конкретного типа. PrettyPrint-Override ">

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

import typing

ParserNodeSubs: typing.TypeAlias = "StartTag | RawText"

def doTheThing(node: ParserNode) -> None:
node = typing.cast(ParserNodeSubs, node)
if isinstance(node, StartTag):
...
elif isinstance(node, RawText):
...
else:
typing.assert_never(node)
Это работает так, как я хочу, но это немного раздражающе словесно для ситуации, в которой я считаю, что не требует этого, требуя, чтобы я вручную поддерживать список Parsernodesubs (tho только в одном месте), а затем вручную разыграть переменные, когда мне они нужны. Есть ли лучший способ объявить эти классы, что заставляет его работать автоматически?

Подробнее здесь: https://stackoverflow.com/questions/795 ... l-coverage
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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