记录Python导入上层目录中的包的各种方法

在这里插入图片描述
想在BuildData中导入common文件夹中的utils.py文件,由于要添加父类路径,于是尝试多种方法

第一种方法

sys.path.append("..")
from common.utils import Preprocessor

对我来说没有用,但是对同样代码的同学来说是适用的

第二种

import sys
import path

folder = path.Path(__file__).dirname()
sys.path.append(str(folder.parent))  # 表示添加上级目录

依旧无效

第三种

sys.path.insert(0,"..")

终于有用了!!!参考文章说法为,append方法会将添加的路径放在最后,这可能导致和其他路径之间发生冲突从而导致路径失效。而insert方法则能够将路径添加在开头,从而提高路径的优先级。

参考文章:https://segmentfault.com/a/1190000041131903

### Python 中 LazyModule 的具体含义与用法 #### 1. **LazyModule 的背景** `LazyModule` 是一种模块加载优化方式,通常用于延迟导入某些模块的内容。其核心思想是在模块的实际功能未被调用之前,避免执行不必要的初始化工作或加载较大的依赖库。这有助于减少启动时间以及降低内存消耗。 尽管标准库中并没有直接提供名为 `LazyModule` 的内置类,但开发者可以根据需求自行实现这一机制。例如,在一些大型项目中,可能会遇到这样的情况:部分子模块仅在特定条件下才会被使用到;如果提前加载这些模块,则会增加系统的复杂性和开销[^1]。 #### 2. **LazyModule 的实现原理** 以下是通过自定义装饰器来模拟 `LazyModule` 行为的一个简单案例: ```python class LazyLoader(types.ModuleType): """ Lazily import a module, mainly to avoid pulling in large dependencies. """ def __init__(self, local_name, parent_module_globals, name): self._local_name = local_name self._parent_module_globals = parent_module_globals super(LazyLoader, self).__init__(name) def _load(self): # Load the actual module on first call and assign it to global dict of caller's namespace module = importlib.import_module(self.__name__) self._parent_module_globals[self._local_name] = module return module def __getattr__(self, item): return getattr(self._load(), item) def __dir__(self): return dir(self._load()) ``` 此代码片段来源于 TensorFlow 官方仓库中的一个实用工具文件[^2]。在这里我们看到的是一个叫做 `LazyLoader` 类型的对象,它可以用来替代传统意义上的静态导入语句。每当尝试访问此类实例下的任何属性时,都会触发内部 `_load()` 函数完成真实模块的动态引入动作。 #### 3. **使用场景分析** - **大数据处理平台**: 像 Spark 这样的分布式计算引擎就广泛采用了类似的技巧以便按需分发必要的算法给各个节点运行环境里去。 - **机器学习框架**: PyTorch 或者 Keras 都会在适当时候才加载 GPU 支持相关的驱动程序接口,这样即使用户的硬件配置不具备相应条件也不会影响基础功能正常使用[^3]. - **Web 应用服务器端开发**: Flask/Django 等流行的微型框架同样存在很多插件扩展可供选择安装,而它们之间往往存在着错综复杂的相互关系链路图谱结构,因此合理安排好各自的出场顺序显得尤为重要起来. #### 4. **源码剖析** 让我们进一步深入探讨上面那段关于 `LazyLoader` 的简化版实现细节吧! 首先注意到它的基类继承自 Python 内置类型之一 —— `types.ModuleType`, 此举使得最终生成出来的代理对象能够完美伪装成正规合法的标准模块形式呈现出来供外界消费调用之便[^4]. 接下来重点观察以下几个方面特性: - **构造方法 (`__init__`) :** 初始化过程中记录三个重要参数分别是目标别名(`_local_name`), 上层作用域全局变量表(`_parent_module_globals`)还有待装载的目标全限定路径名称(`name`). - **私有成员函数 (_load_) :** 当前时刻正式负责发起真正的外部实体抓取流程并将结果缓存回原始调用位置处等待后续重复利用机会到来为止. - **重写的特殊方法 (__getattr__, __dir__) :** 主要目的是拦截所有未知字段查找请求并委派至底层已准备完毕的真实主体上去继续寻找匹配答案直至成功返回或者抛出异常结束整个链条追踪过程. --- ### 总结 通过对 `LazyModule` (这里实际上是 `LazyLoader`) 的介绍可以看出这是一种非常有效的手段可以帮助解决许多实际工程难题的同时还能带来额外的好处诸如改善整体架构清晰程度等等优势特征明显值得推荐采纳应用实践当中不断探索完善下去.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值