IDE python автозаполнение - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть следующий код: (Обратите внимание, что следующий код является сокращением реального кода)

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?

1 Ответ

0 голосов
/ 21 февраля 2020

Если вы используете emacs с anaconda-mode и company-anaconda, тогда вы получите ожидаемые завершения в исходном буфере (как только вы оценили свой код в REPL).

enter image description here

...