【发布时间】: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