我的包中有数千个模型,每个模型都包含一个类。用户可以通过以下方式选择自己想要使用的型号:
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秒。
VSCode 使用静态分析来实现其 IntelliSense 功能, 这意味着它会分析代码而不实际运行它。
如果你想获得智能感知支持,你必须在脚本的开头添加导入代码,如
from myproject.type1.models import m1, m2, m3 # Add all the modules you want IntelliSense for
。