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

问题描述

我可以使用任何技巧来使IDE为动态生成的类属性提供代码完成功能吗?例如


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

此代码会将名为A的{​​{1}}的类属性设置为a的值。但是IDE不了解5,因此您不会获得代码完成。我已经迷上了read that a方法,但是该答案中的建议对我没有用。有人有什么主意吗?

解决方法

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

因此,如果您确实需要自动完成功能,则可以尝试使用Jupyter笔记本。不过,您必须先实例化变量,然后才能自动完成。

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

,

为此,我不得不使用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

Code in action

,

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...