pycharm 如何使用动态导入的python类启用IDE智能感知?

nr9pn0ug  于 5个月前  发布在  PyCharm
关注(0)|答案(2)|浏览(66)

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

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


但这会引起一个问题。
如果m1是由ModelLoader汇入,则Vscode或pycharm无法提供IntelliSense。
智能感知的工作原理:


的数据
不工作:



如何让IDE知道类ModelLoader有一个成员m1,并且在myproject.type1.models.m1中定义?
我没有导入我的包的__init__中的所有模块,因为它会损害用户体验,它需要大约30秒来导入所有模型。

s2j5cfk0

s2j5cfk01#

您可以尝试基于type1目录生成.pyi文件。
Pylance可以使用它来进行静态代码分析。

omqzjyyz

omqzjyyz2#

VSCode在其智能感知功能中使用静态分析,这意味着它在不实际运行代码的情况下分析代码。
如果您希望获得intellisense支持,则必须在脚本的开头添加导入代码,如
第一个月
添加您想要智能感知的所有模块。

相关问题