提问人:CiaranWelsh 提问时间:8/16/2020 最后编辑:jonrsharpeCiaranWelsh 更新时间:8/29/2020 访问量:3907
是否可以让 Python IDE 为动态生成的类属性提供自动完成功能?
Is it possible to have Python IDEs offer autocompletion for dynamically generated class attributes?
问:
我可以使用任何技巧来让 IDE 为动态生成的类属性提供代码完成?例如
class A:
def __init__(self):
setattr(self, "a", 5)
此代码将 调用的 class 属性设置为 的值。但是 IDE 不知道,因此您不会获得它的代码完成。我读过该方法可以上钩,但该答案中提出的建议对我不起作用。有人有什么想法吗?A
a
5
a
__dir__
答:
相信你会在这里找到答案。简而言之,Pycharm 目前不支持动态属性(而且可能在可观察到的未来不会)支持动态属性。这是因为它静态地分析代码,并且无法“看到”类可能具有的属性。另一方面,当您在(例如)iPython 中运行代码时,一旦创建了此类的实例,编辑器就可以获取驻留在内存中的特定实例的属性,从而在自动完成中显示它们。在这种情况下会有所帮助。我认为其他 IDE 也是如此。__dir__
因此,如果您确实需要自动完成功能,您可能需要尝试使用 Jupyter 笔记本。不过,您必须在自动完成之前实例化变量。
另一种可能的解决方案是利用 IDE 支持的文件(Python 接口文件存根)。您可以在代码中添加一个小片段,该代码片段使用动态属性实例化类,并记下类接口文件 ()。然后 IDE 将使用它进行自动完成。显然,这个解决方案会有“一次运行延迟”,但就像在 PyCharm 中一样,您只需单击类名附近的星号即可切换到此类文件,您可以在进行大量更改时手动更新它。.pyi
.pyi
评论
writes down a class interface
pyi
.pyi
Spyder 提供自动建议选项而不是自动完成。风筝集成可能有助于更快地设置代码。风筝实际上是一个自动完成插件。还可以将其与 Visual Studio Code 一起使用。
为此,我不得不使用联合类型来获取所有可能的自动完成选项。编写它需要一些额外的时间,但是当我的程序很大时,这是值得的。
from typing import Union
class dynamic1(object):
def __init__(self):
self.b = 5
self.c = 0
class dynamic2(dynamic1):
def __init__(self):
self.e = 10
self.d = 11
class dynamic3:
def __init__(self):
self.f = 12
def func(li):
return li[1]
def func() -> Union[dynamic1, dynamic2, dynamic3]:
a = [dynamic1(), dynamic2(), dynamic3()]
b = func(a)
return b
评论
a: int