【问题标题】:Is it possible to have Python IDEs offer autocompletion for dynamically generated class attributes?是否可以让 Python IDE 为动态生成的类属性提供自动完成功能?
【发布时间】:2020-12-05 17:48:57
【问题描述】:

我可以使用什么技巧让 IDE 为动态生成的类属性提供代码完成功能?比如


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

此代码会将名为aA 的类属性设置为5 的值。但是 IDE 不知道 a,因此您无法获得它的代码完成功能。我有read that __dir__ 方法可以上钩,但该答案中提出的建议对我不起作用。有人有什么想法吗?

【问题讨论】:

  • 我也不太确定是否投反对票。我的直觉是,您的问题的答案是“否”,因为静态分析在这里看不到任何东西,但是,嘿,JIT 是一回事,也许有一些智能 IDE 魔法可以做到这一点
  • 我的想法也是如此,但如果有一个黑客可以让它工作,那就太好了。也许那里有一个 Python 向导可以帮助我:)
  • 哪些 IDE?还有什么限制? (例如,您可以使用a: int 之类的类型注释吗?文档字符串?)
  • 我使用 Pycharm,但如果能与其他人一起使用它会很有趣。是的,类型注释是允许的......事实上,我对任何和所有想法都感兴趣。我遇到过几次这个问题,想知道是否存在 any 策略,无论需要哪些工具(如类型注释)。感谢您的回复。

标签: python autocomplete attributes


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-12-27
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-16
        • 1970-01-01
        • 2020-06-05
        相关资源
        最近更新 更多