是否可以让 Python IDE 为动态生成的 class 属性提供自动完成功能?

Is it possible to have Python IDEs offer autocompletion for dynamically generated class attributes?

是否有任何技巧可以让 IDE 为动态生成的 class 属性提供代码补全?例如


class A:
    
    def __init__(self):
        setattr(self, "a", 5)

此代码会将名为 aA 的 class 属性设置为 5 的值。但是 IDE 不知道 a,因此您无法获得它的代码补全。我已经 read that __dir__ 方法可以挂钩,但该答案中的建议对我没有用。有人有什么想法吗?

相信你会找到答案here。简而言之,Pycharm 目前不支持(并且可能在可观察的未来不会)支持动态属性。那是因为它静态分析代码,无法“看到”class 可能具有的属性。另一方面,当您 运行 您的代码在(比如)iPython 中时,一旦创建了此类 class 的实例,编辑器就可以获取驻留在其中的特定实例的属性内存,从而在自动完成中显示它们。在这种情况下 __dir__ 会有所帮助。我假设其他 IDEs.

也是如此

所以如果你真的需要自动完成功能,你可能想尝试使用 Jupyter notebook。不过,您必须在获得自动完成之前实例化您的变量。

另一种可能的解决方案是利用 IDE 支持 .pyi 文件(Python 接口文件存根)。您可以在代码中添加一个小片段,用动态属性实例化 class,并写下一个 class 接口文件 (.pyi)。然后 IDE 将使用它来自动完成。显然,此解决方案会有“一个 运行 延迟”,但如 PyCharm 中一样,您只需单击 class 名称附近的星号即可切换到此类文件,您可以手动更新发生巨大变化时。

Spyder 提供自动建议选项而不是自动完成。风筝集成可能有助于更快地设置代码。 Kite 实际上是一个自动补全插件。您也可以将其与 Visual studio 代码一起使用。

为此,我不得不使用 Union 类型来获取所有可能的自动完成选项。写它需要一些额外的时间,但是当我的程序很大时,这是值得的。

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