我的软件包中有数千个模型,每个模型都包含一个类。用户可以通过以下方式选择他们想要使用的模型:
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秒来导入所有模型。
2条答案
按热度按时间s2j5cfk01#
您可以尝试基于
type1
目录生成.pyi
文件。Pylance可以使用它来进行静态代码分析。
omqzjyyz2#
VSCode在其智能感知功能中使用静态分析,这意味着它在不实际运行代码的情况下分析代码。
如果您希望获得intellisense支持,则必须在脚本的开头添加导入代码,如
第一个月
添加您想要智能感知的所有模块。