Может ли «Перейти к определению» перейти к конкретному классу в VSCode/Python (Pylance) во время отладки?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Может ли «Перейти к определению» перейти к конкретному классу в VSCode/Python (Pylance) во время отладки?

Сообщение Anonymous »

Я определяю атрибут типа MyAbstractClass (абстрактный класс), который принимает значение конкретного подкласса MyConcreteClass. Когда я нажимаю «Перейти к определению» в VSCode при poke в self.item.poke(), я перехожу к MyAbstractClass.poke(), что и ожидалось.
Однако во время выполнения в режиме отладки, когдаContainer.item привязан к экземпляру MyConcreteClass, IDE могла бы работать лучше и перевести меня в MyConcreteClass.poke( ). Есть ли простые способы сделать это?
Все, что мне нужно, — это больше удобства при редактировании и отладке моего кода.
Один из вариантов — заменить item: MyAbstractClass с item: Union[MyAbstractClass, MyConcreteClass, MyConcreteClass2, ...], и в этом случае команда «Перейти к определению» создаст всплывающее окно со всеми перечисленными методами, что позволит мне прыгать через них. Однако необходимость вручную перечислять все возможные подклассы нарушает модульность, а также мне приходится самому проверять конкретный тип объекта. Существует ли решение, которое автоматизирует это и использует преимущества инфраструктуры динамического разрешения Python?
Другой вариант — удалить все подсказки типов. Затем «Перейти к определению» в режиме отладки переходит непосредственно к конкретной реализации метода. Это происходит за счет того, что он вообще не работает, если только не запущен отладчик и не привязан контейнер.item.
Ни один из вариантов не является оптимальным. Я хочу получить лучшее в обеих ситуациях: перейти к абстрактному методу при редактировании в автономном режиме и перейти к конкретному методу при отладке.
from abc import ABC, abstractmethod

class MyAbstractClass(ABC):
@abstractmethod
def __init__(self):
pass

@abstractmethod
def poke(self):
pass

class MyConcreteClass(MyAbstractClass):
def __init__(self):
pass

def poke(self):
print("Poked!")

class MyContainerClass():
item : MyAbstractClass
def __init__(self, item: MyAbstractClass):
self.item = item

def poke_item(self):
self.item.poke()

item = MyConcreteClass()
container = MyContainerClass(item=item)
container.poke_item()



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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как «Перейти к определению» и «Перейти к ссылкам» работают в vscode для Python?
    Anonymous » » в форуме Python
    0 Ответы
    29 Просмотры
    Последнее сообщение Anonymous
  • VSCode «перейти к определению» не работает
    Anonymous » » в форуме C++
    0 Ответы
    65 Просмотры
    Последнее сообщение Anonymous
  • Невозможно использовать «Перейти к определению» в VSCode [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    37 Просмотры
    Последнее сообщение Anonymous
  • VSCode «перейти к определению» не работает
    Anonymous » » в форуме C++
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • VSCode C# «перейти к определению» (F12) не работает
    Anonymous » » в форуме C#
    0 Ответы
    59 Просмотры
    Последнее сообщение Anonymous

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