如何使用动态导入的Python类启用IDE IntelliSense?

问题描述 投票:0回答:1

我的包中有数千个模型,每个模型都包含一个类。用户可以通过以下方式选择自己想要使用的型号:

from myproject.type1.models.m1 import m1

非常不方便。

子文件夹如下所示:

type1/
├── __init__.py
├── constant.py
├── decorator.py
├── models
│   ├── m1.py
│   ├── m2.py
│   ├── m3.py
...
│   ├── m999.py

所以我写了一个模块加载器来动态加载模块:

class ModelLoader:
    def __init__(self, model_path):
        self.model_path = model_path
        self.models = {}

    def __getattribute__(self, __name: str) -> Any:
        try:
            return super().__getattribute__(__name)
        except AttributeError:
            if __name not in self.models:
                try:
                    model_file = import_module(self.model_path + "." + __name)
                    model = getattr(model_file, __name)
                    self.models[__name] = model
                    return model
                except ModuleNotFoundError:
                    raise AttributeError(f"Model {__name} not found")
            else:
                return self.models[__name]

这样,用户可以通过以下方式加载模块:

models = ModelLoader(__name__.rsplit(".", 1)[0] + ".models")
m1 = models.m1
m2 = models.m2

但这会导致一个问题。

如果通过

ModelLoader
导入m1,Vscode或pycharm无法为m1提供IntelliSense。

智能感知工作原理:

不工作:

如何让 IDE 知道类

ModelLoader
有一个成员
m1
并且在
myproject.type1.models.m1
中定义?


我不会导入我的包中的所有模块

__init__
因为这会损害用户体验,导入所有模型大约需要30秒。

python visual-studio-code pycharm intellisense
1个回答
0
投票

VSCode 使用静态分析来实现其 IntelliSense 功能, 这意味着它会分析代码而不实际运行它。

如果你想获得智能感知支持,你必须在脚本的开头添加导入代码,如

from myproject.type1.models import m1, m2, m3  # Add all the modules you want IntelliSense for

© www.soinside.com 2019 - 2024. All rights reserved.