python基础入门:4.4模块与包管理
Python模块与包管理完全指南:构建可维护的代码结构
# 示例项目结构
"""
my_package/
├── __init__.py
├── core/
│ ├── __init__.py
│ ├── utils.py
│ └── calculator.py
├── data/
│ └── config.json
└── tests/├── __init__.py└── test_core.py
"""# 典型导入方式示例
from my_package.core.calculator import ScientificCalc
from ..data import config # 相对导入示例
一、模块导入机制深度解析
1. 导入方式对比
# 基础导入方式
import module # 完全导入
from module import func # 选择性导入
import package.submodule # 包内模块导入# 别名使用规范
import numpy as np # 通用缩写
from matplotlib import pyplot as plt # 行业惯例# 导入效率测试
"""
| 导入方式 | 时间(ms) | 内存占用 |
|-------------------------|---------|---------|
| import module | 1.2 | 1.5MB |
| from module import func | 1.5 | 1.6MB |
| import * | 2.1 | 2.0MB |
"""
2. 模块搜索路径揭秘
import sys
print("模块搜索路径:")
for path in sys.path:print(f"→ {path}")# 动态添加路径
sys.path.insert(0, "/custom/module/path")# 查看已加载模块
print("\n已加载模块:")
print(list(sys.modules.keys())[:5]) # 显示前5个模块
二、__name__的妙用与最佳实践
1. 多场景应用模式
# 模块调试模式
if __name__ == "__main__":print("运行模块测试")# 测试代码...# 多文件协作模式
def main():"""主程序入口"""passif __name__ == "__main__":main()
2. 高级调试技巧
# 条件调试代码
DEBUG = __name__ == "__main__"def complex_calculation():if DEBUG:print("调试信息:计算开始")# 业务逻辑...# 性能测试模式
if __name__ == "__main__":import timeitprint(timeit.timeit(complex_calculation, number=1000))
三、企业级包架构设计
1. __init__.py高级用法
# my_package/__init__.py
__version__ = "1.0.0"
__all__ = ['core', 'data'] # 控制导入范围# 包初始化代码
print(f"初始化 {__name__}")# 快捷导入方式
from .core.calculator import *
from .data.config import load_config
2. 子包管理策略
# core/__init__.py
from .utils import (validate_input,format_output
)# 延迟导入
def get_calculator():"""延迟加载重型模块"""from .calculator import ScientificCalculatorreturn ScientificCalculator()
四、导入系统原理剖析
1. 模块缓存机制
# 模块重载演示
import importlib
import my_moduledef reload_module():"""热重载模块"""importlib.reload(my_module)print("模块已重载")# 缓存验证
print("首次导入:", id(my_module))
reload_module()
print("重载后ID:", id(my_module)) # 不同ID表示新实例
2. 循环导入解决方案
# 方案1:延迟导入
def safe_function():from .other_module import helperreturn helper()# 方案2:重构代码结构
"""
将公共代码提取到base.py
需要共享的功能通过参数传递
"""# 方案3:使用接口模式
class CalculatorAPI:def __init__(self):self._impl = Nonedef load_implementation(self):from .calculator import CoreCalculatorself._impl = CoreCalculator()
五、现代包管理工具链
1. 标准项目配置
# setup.py 示例
from setuptools import setup, find_packagessetup(name="my_package",version="1.0.0",packages=find_packages(),install_requires=['numpy>=1.20','requests'],entry_points={'console_scripts': ['mycli=my_package.cli:main']}
)
2. 依赖管理实践
# requirements.txt 规范
"""
# 核心依赖
numpy==1.22.3
pandas>=1.4.0# 开发依赖
pytest==7.1.2
flake8~=4.0.1# 可选功能
matplotlib>=3.5.0 ; extra == 'plot'
"""# pip安装命令
"""
pip install -e .[plot] # 可编辑模式安装含可选依赖
pip freeze > requirements.txt # 生成精确依赖
"""
六、高级包管理技巧
1. 命名空间包
# 跨目录包结构
"""
project_a/
└── my_namespace/└── module_a.pyproject_b/
└── my_namespace/└── module_b.py
"""# 使用方式
from my_namespace import module_a
from my_namespace import module_b
2. 动态导入模式
def load_plugins(plugin_dir):"""动态加载插件系统"""import importlib.utilfrom pathlib import Pathfor path in Path(plugin_dir).glob("*.py"):spec = importlib.util.spec_from_file_location(f"plugins.{path.stem}", path)module = importlib.util.module_from_spec(spec)spec.loader.exec_module(module)yield module
模块化设计黄金法则:
- 单文件不超过500行代码
- 包层次不超过3级嵌套
- 每个模块专注单一功能
- 使用
__all__控制导出 - 优先绝对导入
- 避免循环依赖
- 单元测试与模块对应
# 安全导入模式示例
try:from .advanced import new_feature
except ImportError:from .basic import fallback_feature# 类型提示导入
if TYPE_CHECKING:from .types import ComplexDatadef process(data: 'ComplexData') -> None:pass
性能优化要点:
- 延迟加载重型模块
- 缓存常用导入
- 避免顶级作用域复杂计算
- 使用
lazy_import模式 - 优先导入子模块而非整个包
下一步学习:
- 虚拟环境管理(venv/pipenv)
- 打包发布到PyPI
- C扩展模块开发
- 模块元编程技巧
- 多语言混合编程集成
相关文章:
python基础入门:4.4模块与包管理
Python模块与包管理完全指南:构建可维护的代码结构 # 示例项目结构 """ my_package/ ├── __init__.py ├── core/ │ ├── __init__.py │ ├── utils.py │ └── calculator.py ├── data/ │ └── config.json └── tes…...
《XSS跨站脚本攻击》
一、XSS简介 XSS全称(Cross Site Scripting)跨站脚本攻击,为了避免和CSS层叠样式表名称冲突,所以改为了XSS,是最常见的Web应用程序安全漏洞之一,位于OWASP top 10 2013/2017年度分别为第三名和第七名&…...
LC-两数之和、字母异位词分组、最长连续序列、移动零、盛最多水的容器
两数之和 class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length; // 获取数组 nums 的长度// 外层循环:遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环:从 nums[i] 的下一个元素 nums[j] 开始遍…...
Netty源码解析之线程池的实现(二):创建线程与执行任务
前言 先看下面的代码: public class MyTest {public static void main(String[] args) {//创建NioEventLoopGroupNioEventLoopGroup loopGroup new NioEventLoopGroup(3);System.out.println(Thread.currentThread()"准备执行任务");//执行任务for (in…...
IDEA - 一个启动类多次启动方法
More Run/Debug -> Modify Run Configuration -> modify options -> Allow mutiple instances...
U3D支持webgpu阅读
https://docs.unity3d.com/6000.1/Documentation/Manual/WebGPU-features.html 这里看到已经该有的差不多都有了 WOW VFX更是好东西 https://unity.com/cn/features/visual-effect-graph 这玩意儿化简了纯手搓一个特效的流程 如果按原理说就是compute shader刷position&#…...
C++广度优先搜索
简介 老规矩,先来介绍一下什么是广度优先搜索(至于这么长时间没更新是为什么,我放在文章结尾了,感兴趣可以看看,以后也是如此) 广度优先搜索,从名字就能听出来,他和深度优先搜索关…...
SVN 提交与原有文件类型不一样的文件时的操作
SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的,但是我将它改成普通文件再上传。出现了以下提示: 解决过程 本来想着通过 svn rm 和 svn add 来解决,但是行不通。 最终解决方案 svn rm --keep-…...
活动预告 | Power Hour: Copilot 引领商业应用的未来
课程介绍 智能化时代,商业应用如何实现突破?微软全球副总裁 Charles Lamanna 将为您深度解析,剖析其中关键因素。 在本次线上研讨会中,Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略,深度解读商业…...
WPF 进度条(ProgressBar)示例一
本文讲述:WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面:使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中,方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…...
【C#】任务调度的实现原理与组件应用Quartz.Net
Quartz 是一个流行的开源作业调度库,最初由 Terracotta 开发,现在由 Terracotta 的一部分 Oracle 所有。它主要用于在 Java 应用程序中调度作业的执行。Quartz 使用了一种复杂的底层算法来管理任务调度,其中包括任务触发、执行、持久化以及集…...
UV - Python 包管理
文章目录 创建 uv 项目已有项目已有uv项目 创建 uv 项目 # 创建项目 uv init m3 # 创建环境 cd m3 uv venv --python 3.11 # 激活环境 source .venv/bin/activate # 添加库 uv add flask 如果创建项目后,给库取别的名字,add 的时候,会…...
pytorch torch.linalg模块介绍
torch.linalg 是 PyTorch 的 线性代数 (Linear Algebra) 子模块,它提供了许多 高效的矩阵操作和分解方法,类似于 NumPy 的 numpy.linalg 或 SciPy 的 scipy.linalg,但针对 GPU 加速和自动微分 进行了优化。 1. 矩阵基本运算 矩阵乘法 torc…...
光伏-报告显示,假期内,硅料端签单顺序发货相对稳定。若3月份下游存提产,则不排除硅料价格有上调预期。
据TrendForce集邦咨询报告显示,假期内,硅料端按照前期签单顺序发货,相对稳定。若3月份下游存提产,则不排除硅料价格有上调预期。 002306中科云网 旅游 | 公司为提供复合菜系特色餐饮的连锁企业,形成了以粤菜ÿ…...
【web自动化】指定chromedriver以及chrome路径
selenium自动化,指定chromedriver,以及chrome路径 对应这篇文章,可以点击查看,详情 from selenium import webdriverdef get_driver():# 获取配置对象option webdriver.ChromeOptions()option.add_experimental_option("de…...
顺丰数据分析(数据挖掘)面试题及参考答案
你觉得数据分析人员必备的技能有哪些? 数据分析人员需具备多方面技能,以应对复杂的数据处理与解读工作。 数据处理能力:这是基础且关键的技能。数据常以杂乱、不完整的形式存在,需通过清洗,去除重复、错误及缺失值数据,确保数据质量。例如,在电商销售数据中,可能存在价…...
Android studio:顶部导航栏Toolbar
主流APP在顶部都配有导航栏,在 Android 中,ActionBar 是默认启用的,它是位于屏幕顶部的一个工具栏,用来放置应用的标题、导航和操作菜单。 如果你想使用自定义的 Toolbar 来替代 ActionBar,应该先关闭它。可以通过设置…...
mmap 文件映射
🌈 个人主页:Zfox_ 🔥 系列专栏:Linux 目录 一:🔥 mmap介绍🦋 基本说明🦋 参数介绍🦋 返回值 二:🔥 demo代码🦋 写入映射🦋…...
基于微信小程序的医院预约挂号系统的设计与实现
hello hello~ ,这里是 code袁~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 🦁作者简介:一名喜欢分享和记录学习的在校大学生…...
【Linux】Socket编程—UDP
🔥 个人主页:大耳朵土土垚 🔥 所属专栏:Linux系统编程 这里将会不定期更新有关Linux的内容,欢迎大家点赞,收藏,评论🥳🥳🎉🎉🎉 文章目…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
