Средства проверки статических типов и языковые серверы не распознают атрибуты объектов, которые являются подклассамиPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Средства проверки статических типов и языковые серверы не распознают атрибуты объектов, которые являются подклассами

Сообщение Anonymous »

Прошу прощения, если заголовок выглядит немного запутанным, проблема немного сложно сформулировать.
Скажем, я строю граф с узлами и ребрами. У него есть базовый класс Node с общими атрибутами для всех узлов, и каждый конкретный тип узла может наследовать от него, расширяя дополнительные атрибуты.
В качестве примера рассмотрим следующий пример с двумя узлами. типы:

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

from typing import TypeVar

# nodes.py
class Node:
def __init__(self, base_param: str) -> None:
self.base_param = base_param

# other base methods...

class NodeType1(Node):
def __init__(self, base_param: str, node_param_type1: int) -> None:
super().__init__(base_param)
self.node_param_type1 = node_param_type1

# other type1 methods...

class NodeType2(Node):
def __init__(self, base_param: str, node_param_type2: int) -> None:
super().__init__(base_param)
self.node_param_type2 = node_param_type2

# other type2 methods...

NodeSubClassType = TypeVar("NodeSubClassType", bound=Node)
У него также есть базовый класс Edge с исходным и целевым, которые являются подклассами Node. В качестве примера рассмотрим следующий пример: ребро соединяет NodeType1 с NodeType2.

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

# edges.py
class Edge:
def __init__(self, source: NodeSubClassType, target: NodeSubClassType) -> None:
self.source = source
self.target = target

# other base methods...

class EdgeType1ToType2(Edge):
# Must contain `NodeType1` as `source` and `NodeType2` as `target` when instantiated
pass

# or add other `type1 to type2` methods
Моя проблема заключается в том, что всякий раз, когда я создаю экземпляр EdgeType1ToType2, передавая правильные объекты, только базовый атрибут base_param источника и цели распознается статическими средствами проверки (я пробовал mypy) и языковыми серверами (я пробовал pylsp). Например, в следующем скрипте:

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

if __name__ == "__main__":

node_type1 = NodeType1("base_param", 1)
node_type2 = NodeType2("base_param", 2)
edge_12 = EdgeType1ToType2(source=node_type1, target=node_type2)

node_type1.base_param  # this has no issue
edge_12.source.base_param  # this has no issue
node_type1.node_param_type1  # this has no issue
edge_12.source.node_param_type1  # this is not recognized by `mypy` or the LSP
Если я запустил mypy, я получу сообщение

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

error: "NodeSubClassType" has no attribute "node_param_type1"  [attr-defined]
Found 1 error in 1 file (checked 1 source file)
только для строки Edge_12.source.node_param_type1. Кроме того, языковой сервер не распознает node_param_type1 как атрибут Edge_12.source. Похожие проблемы с Edge_12.target.
Я пробовал:
  • Добавление лишнего __init__ передача правильных параметров в подкласс, например

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

    class EdgeType1ToType2(Edge):
    
    def __init__(self, source: NodeType1, target: NodeType2) -> None:
    super().__init__(source, target)
    
    но это не работает.
  • и заменим пользовательский тип NodeSubClassType на непосредственно суперкласс Node, но вместо этого я получил то же сообщение с Node.
Я ожидаю, что решение будет успешным при статическом проверочном анализе и, возможно, будет признано языковыми серверами как допустимый атрибут.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Обеспечение безопасности типов между конкретными подклассами абстрактного базового класса в Python
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Регистрация API Polars и средства проверки типов
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Возникла проблема с подклассами в WinUI3 C++
    Anonymous » » в форуме C#
    0 Ответы
    17 Просмотры
    Последнее сообщение Anonymous
  • Кому переопределить метод класса шаблона с различными подклассами параметров в подклассах
    Anonymous » » в форуме JAVA
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Отладчик vsc python и pylance не распознают установленный пакет
    Anonymous » » в форуме Python
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous

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