当前位置: 首页 > news >正文

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

模块化设计黄金法则

  1. 单文件不超过500行代码
  2. 包层次不超过3级嵌套
  3. 每个模块专注单一功能
  4. 使用__all__控制导出
  5. 优先绝对导入
  6. 避免循环依赖
  7. 单元测试与模块对应
# 安全导入模式示例
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 的长度// 外层循环&#xff1a;遍历数组中的每一个元素 nums[i]for(int i 0; i < n; i) {// 内层循环&#xff1a;从 nums[i] 的下一个元素 nums[j] 开始遍…...

Netty源码解析之线程池的实现(二):创建线程与执行任务

前言 先看下面的代码&#xff1a; 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++广度优先搜索

简介 老规矩&#xff0c;先来介绍一下什么是广度优先搜索&#xff08;至于这么长时间没更新是为什么&#xff0c;我放在文章结尾了&#xff0c;感兴趣可以看看&#xff0c;以后也是如此&#xff09; 广度优先搜索&#xff0c;从名字就能听出来&#xff0c;他和深度优先搜索关…...

SVN 提交与原有文件类型不一样的文件时的操作

SVN 提交与原有文件类型不一样的文件时的操作 背景 SVN 服务器上原本的文件是软链接类型的&#xff0c;但是我将它改成普通文件再上传。出现了以下提示&#xff1a; 解决过程 本来想着通过 svn rm 和 svn add 来解决&#xff0c;但是行不通。 最终解决方案 svn rm --keep-…...

活动预告 | Power Hour: Copilot 引领商业应用的未来

课程介绍 智能化时代&#xff0c;商业应用如何实现突破&#xff1f;微软全球副总裁 Charles Lamanna 将为您深度解析&#xff0c;剖析其中关键因素。 在本次线上研讨会中&#xff0c;Charles Lamanna 将分享他在增强商业运营方面的独到见解与实战策略&#xff0c;深度解读商业…...

WPF 进度条(ProgressBar)示例一

本文讲述&#xff1a;WPF 进度条(ProgressBar)简单的样式修改和使用。 进度显示界面&#xff1a;使用UserControl把ProgressBar和进度值以及要显示的内容全部组装在UserControl界面中&#xff0c;方便其他界面直接进行使用。 <UserControl x:Class"DefProcessBarDemo…...

【C#】任务调度的实现原理与组件应用Quartz.Net

Quartz 是一个流行的开源作业调度库&#xff0c;最初由 Terracotta 开发&#xff0c;现在由 Terracotta 的一部分 Oracle 所有。它主要用于在 Java 应用程序中调度作业的执行。Quartz 使用了一种复杂的底层算法来管理任务调度&#xff0c;其中包括任务触发、执行、持久化以及集…...

UV - Python 包管理

文章目录 创建 uv 项目已有项目已有uv项目 创建 uv 项目 # 创建项目 uv init m3 # 创建环境 cd m3 uv venv --python 3.11 # 激活环境 source .venv/bin/activate # 添加库 uv add flask 如果创建项目后&#xff0c;给库取别的名字&#xff0c;add 的时候&#xff0c;会…...

pytorch torch.linalg模块介绍

torch.linalg 是 PyTorch 的 线性代数 (Linear Algebra) 子模块&#xff0c;它提供了许多 高效的矩阵操作和分解方法&#xff0c;类似于 NumPy 的 numpy.linalg 或 SciPy 的 scipy.linalg&#xff0c;但针对 GPU 加速和自动微分 进行了优化。 1. 矩阵基本运算 矩阵乘法 torc…...

光伏-报告显示,假期内,硅料端签单顺序发货相对稳定。若3月份下游存提产,则不排除硅料价格有上调预期。

据TrendForce集邦咨询报告显示&#xff0c;假期内&#xff0c;硅料端按照前期签单顺序发货&#xff0c;相对稳定。若3月份下游存提产&#xff0c;则不排除硅料价格有上调预期。 002306中科云网 旅游 | 公司为提供复合菜系特色餐饮的连锁企业&#xff0c;形成了以粤菜&#xff…...

【web自动化】指定chromedriver以及chrome路径

selenium自动化&#xff0c;指定chromedriver&#xff0c;以及chrome路径 对应这篇文章&#xff0c;可以点击查看&#xff0c;详情 from selenium import webdriverdef get_driver():# 获取配置对象option webdriver.ChromeOptions()option.add_experimental_option("de…...

顺丰数据分析(数据挖掘)面试题及参考答案

你觉得数据分析人员必备的技能有哪些? 数据分析人员需具备多方面技能,以应对复杂的数据处理与解读工作。 数据处理能力:这是基础且关键的技能。数据常以杂乱、不完整的形式存在,需通过清洗,去除重复、错误及缺失值数据,确保数据质量。例如,在电商销售数据中,可能存在价…...

Android studio:顶部导航栏Toolbar

主流APP在顶部都配有导航栏&#xff0c;在 Android 中&#xff0c;ActionBar 是默认启用的&#xff0c;它是位于屏幕顶部的一个工具栏&#xff0c;用来放置应用的标题、导航和操作菜单。 如果你想使用自定义的 Toolbar 来替代 ActionBar&#xff0c;应该先关闭它。可以通过设置…...

mmap 文件映射

&#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; mmap介绍&#x1f98b; 基本说明&#x1f98b; 参数介绍&#x1f98b; 返回值 二&#xff1a;&#x1f525; demo代码&#x1f98b; 写入映射&#x1f98b…...

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…...

【Linux】Socket编程—UDP

&#x1f525; 个人主页&#xff1a;大耳朵土土垚 &#x1f525; 所属专栏&#xff1a;Linux系统编程 这里将会不定期更新有关Linux的内容&#xff0c;欢迎大家点赞&#xff0c;收藏&#xff0c;评论&#x1f973;&#x1f973;&#x1f389;&#x1f389;&#x1f389; 文章目…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库&#xff0c;特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...