问题描述
我可以使用任何技巧来使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
,
Spyder提供自动建议选项,而不是自动完成。风筝集成可能有助于更快地设置代码。风筝实际上是一个自动补全插件。您还可以将其与Visual Studio代码一起使用。