【问题标题】:IDE python auto completionIDE python自动完成
【发布时间】:2020-06-05 02:48:30
【问题描述】:

我有以下代码: (请注意以下代码是对真实代码的缩减)

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 函数,第二个定义 bar 函数。 A&B 实现 foo,C&D 实现 bar

除了我有获取对象列表的包装类之外,该列表只能包含 1 个 API 实现,这意味着它只能获取 A&B 或 C&D。它永远不会获取 A&C A&D B&C B&D。

包装类实现“get_current_object”函数,该函数返回该 API 的实现之一

我正在使用 emacs(spacemacs) 进行 python 开发(也针对我的特定问题尝试了 vscode)。问题是当我使用“get_currect_object”时,我没有正确的自动完成

first_wrapper.get_current_object().foo()
second_wrapper.get_current_object().bar()

在该示例中,我的 IDE 不会完成 foo 或 bar。我意识到 IDE 不可能知道应该完成 foo 或 bar,因为这样做的唯一方法是运行代码(IDE 没有这样做,而是解析模块)。我也尝试过覆盖 dir 但 IDE 没有使用该功能,只有 ipython 使用它

同样,该代码是实际代码的简化。我意识到这段代码有点奇怪,真实的代码对代码设计有更好的解释,可惜我不能放在这里,因为它太大了。

有没有办法告诉 IDE 返回的值可以是 foo 或 bar?

【问题讨论】:

    标签: python visual-studio-code emacs autocomplete wrapper


    【解决方案1】:

    如果您将 emacs 与 anaconda-modecompany-anaconda 一起使用,那么您将在源缓冲区中获得您期望的完成(一旦您在 REPL 中评估了您的代码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2013-07-11
      • 2013-03-26
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多