У меня есть следующий код: (Обратите внимание, что следующий код является сокращением реального кода)
from abc import abstractmethod, ABCMeta
class MyFirstApi(metaclass=ABCMeta):
@abstractmethod
def foo(self):
pass
class A(MyFirstApi):
def foo(self):
print("A - foo")
class B(MyFirstApi):
def foo(self):
print("B - foo")
class MySecondApi(metaclass=ABCMeta):
@abstractmethod
def bar(self):
pass
class C(MySecondApi):
def bar(self):
print("C - bar")
class D(MySecondApi):
def bar(self):
print("D - bar")
class Wrapper:
def __init__(self, my_objects):
self._my_objects = my_objects
self._current_object_index = 0
def get_current_object(self):
return self._my_objects[self._current_object_index]
def set_current_object_index(self, index):
self._current_object_index = index
first_wrapper = Wrapper([A(), B()])
second_wrapper = Wrapper([C(), D()])
Как вы можете видеть, у меня есть 2 API - первый определяет функцию foo, второй определяет функцию бара. A & B реализует foo и C & D реализует бар
Кроме этого у меня есть класс-оболочка, который получает список объектов, Список может содержать только 1 реализацию API , то есть только получает A & B или C & D. Он никогда не получит A & C A & D B & C B & D.
Класс-оболочка реализует функцию "get_current_object", которая возвращает одну из реализаций этого API
Я использую emacs (spacemacs) для разработки python (также пробовал vscode для моей конкретной проблемы c). Проблема в том, что когда я использую «get_currect_object», у меня нет правильного автозаполнения
first_wrapper.get_current_object().foo()
second_wrapper.get_current_object().bar()
В этом примере моя IDE не завершает foo или bar. Я понимаю, что в среде IDE нет никакого возможного способа узнать, что это должно завершить foo или bar, потому что единственный способ сделать это - запустить код (который не выполняется в среде IDE, а анализирует модуль). Я также пытался переопределить dir , но IDE не используют эту функцию, только я python использую ее
Опять же, этот код является сокращением реального кода. Я понимаю, что этот код немного странный, реальный код имеет лучшее объяснение этого дизайна кода, к сожалению, я не могу поместить его здесь, потому что он огромен.
Есть ли способ сказать IDE, что возвращаемые значения могут быть foo или bar?