Python中的绝对和相对导入

news2024/11/28 18:59:52

在本文中,我们将看到Python中的绝对和相对导入。

Python中导入的工作

Python中的import类似于C/C++中的#include header_file。Python模块可以通过使用import导入文件/函数来访问其他模块的代码。import语句是调用import机制的最常见方式,但它不是唯一的方式。

import语句涉及两个操作,它搜索模块,并将搜索结果绑定到本地作用域中的名称。当导入模块时,Python会运行模块文件中的所有代码,并使其可用于导入器文件。当一个模块被导入时,解释器首先在sys.modules中搜索它,sys. modules是所有先前导入的模块。如果没有找到它,那么它将搜索所有具有该名称的内置模块,如果找到它,那么解释器将运行所有代码并使其对文件可用。如果找不到模块,它将在变量sys. path给出的目录列表中搜索同名文件。path是一个变量,包含一个路径列表,其中包含python库、包和包含输入脚本的目录。

例如,导入一个名为math的模块,然后解释器在内置模块中搜索它,如果没有找到,则在sys. path给出的目录列表中搜索名为math.py的文件。

import math
print(math.pi)

import语句的语法

用户可以导入包和模块。注意导入一个包实际上是将包的__init__.py文件作为一个模块导入。用户还可以从包或模块导入特定对象。通常有两种类型的导入语法。当您使用第一个时,您直接导入资源。

import gxg

gxg可以是封装或模块。当用户使用第二种语法时,则用户从另一个包或模块导入资源。

from gxg import geek

geek可以是模块、子包或对象,例如类或函数。

导入语句的样式

PEP 8是python的官方风格指南,它有一套规则来指导如何制定python代码以最大限度地提高其可读性。对于编写import语句,有以下几点:

  1. 导入应该总是写在文件的顶部,就在任何模块注释和文档字符串之后。
  2. 导入通常应该用空格分隔。
  3. 导入应按以下顺序分组。
    标准库导入(Python的内置模块)
    相关第三方库
    本地应用程序/库特定导入
import math
import os

# Third party imports
from flask import Flask
from flask_restful import Api
from flask_sqlalchemy import SQLAlchemy

# Local application imports
from local_module import local_class
from local_package import local_function

Python中的绝对导入vs相对导入

绝对导入涉及完整路径,即,从项目的根文件夹复制到所需的模块。绝对导入状态,即资源将使用其完整路径从项目的根文件夹导入。

语法和实例:
让我们看看下面的目录结构:
在这里插入图片描述
这里有一个名为project的目录,下面有两个子目录,即pkg1、pkg2。pkg1有两个模块,module1和module2。pkg2包含三个模块,module3、module4、init.py,以及一个子包名subpkg1,其中包含module5.py。让我们假设以下情况:

  • pkg 1/module1.py包含一个函数fun 1
  • pkg 2/module3.py包含一个函数fun 2
  • pkg 2/subpkg 1/module5.py包含一个函数fun 3
# importing a fun1 from pkg1/module1
from pkg1.import module1 import fun1
 
from pkg1 import module2
 
# importing a fun2 from pkg2/module3
from pkg2 import module3 import fun2
 
# importing a fun3 from pkg2/subpkg1/module5
from pkg2.subpkg1.module5 import fun3

绝对导入的优点和缺点

优点:

  • 绝对导入非常有用,因为它们是明确和直接的。
  • 绝对导入很容易从导入的资源的位置准确地判断出来,只需查看语句即可。
  • 即使import语句的当前位置发生更改,绝对导入仍保持有效。

缺点:

如果目录结构非常大,则使用绝对导入没有意义。在这种情况下,使用相对导入效果很好。

from pkg1.subpkg2.subpkg3.subpkg4.module5 import fun6

Python中的相对导入

相对导入指定从其当前位置导入的对象或模块,该位置是import语句驻留的位置。有两种类型的相对导入:

  • 隐式相对导入-Python(3.x)中不允许隐式相对导入。
  • 显式相对导入-显式相对导入已经在Python(3.x)中获得批准。

语法和实例:
相对导入的语法取决于当前位置以及要导入的模块或对象的位置。相对导入使用点(.)符号来指定位置。一个点表示模块在当前目录中,两个点表示模块在当前位置的父目录中,三个点表示模块在祖目录中,依此类推。让我们看看下面的目录结构:

在这里插入图片描述
让我们假设以下情况:

  • pkg 1/module1.py包含一个函数fun 1
  • pkg 2/module3.py包含一个函数fun 2
  • pkg 2/subpkg 1/module5.py包含一个函数fun 3
# importing fun1 into pkg1/module1.py
from .module1 import fun1
 
# importing fun2 and fun3 into pkg2/module3.py
from .module3 import fun2
from .subpackage1.module5 import fun3

相对导入的优点和缺点

优点:

  • 使用相对导入简洁明了。
  • 基于当前位置,它降低了import语句的复杂性。

缺点:

  • 相对导入不像绝对导入那样易读。
  • 使用相对导入并不容易,因为很难告诉模块的位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/968063.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见数学名词的物理意义(更新中)

BetterExplained – Math lessons that click 一、复数 i 的物理意义就是旋转,i 就是逆时针旋转90,i*i 就是逆时针旋转180 加法:实部相加,虚部相加 乘法: 复数zxyi控制了函数的放缩和旋转 ——x 放缩,…

Shell开发实践:服务器的磁盘、CPU、内存的占用监控

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏

目录 引出安装npm install安装element-ui安装axios 进行配置main.js中引入添加jwt前端跨域配置 进行初始布局HomeView.vueApp.vue 新增页面和引入home页面导航栏总结 引出 1.vue-cli创建前端工程,安装element-ui,axios和配置; 2.前端跨域的配…

SQL查询本年每月的数据

--一、以一行数据的形式,显示本年的12月的数据,本示例以2017年为例,根据统计日期字段判断,计算总和,查询语句如下:selectsum(case when datepart(month,统计日期)1 then 支付金额 else 0 end) as 1月, sum…

UE4 春节鞭炮

先搞个基类,一个鞭炮的 搞个鞭炮类,存多个鞭炮 在构造函数的位置先生成对应的鞭炮数 将鞭炮绑定到绳子上,随绳子摆动而一起摆动 在基类里面写爆炸事件 最后用Timer去调用

一篇文章搞懂Redis缓存

目录 一、什么是缓存缓存的优缺点缓存的优点缓存的缺点 二、Redis缓存三、缓存的更新策略主动更新策略 四、缓存穿透解决方案 五、缓存雪崩解决方案 六、缓存击穿解决方案 一、什么是缓存 我们都知道在计算机中内存的速度比磁盘要快非常多,如果每次都要去磁盘获取数…

《Python魔法大冒险》004第一个魔法程序

在图书馆的一个安静的角落,魔法师和小鱼坐在一张巨大的桌子前。桌子上摆放着那台神秘的笔记本电脑。 魔法师: 小鱼,你已经学会了如何安装魔法解释器和代码编辑器。是时候开始编写你的第一个Python魔法程序了! 小鱼:(兴奋地两眼放光)我准备好了! 魔法师: 不用担心,…

Lesson6---案例:人脸案例

学习目标 了解opencv进行人脸检测的流程了解Haar特征分类器的内容 1 基础 我们使用机器学习的方法完成人脸检测,首先需要大量的正样本图像(面部图像)和负样本图像(不含面部的图像)来训练分类器。我们需要从其中提取特…

解决Debian系统通过cifs挂载smb后,中文目录乱码问题

解决Debian系统通过cifs挂载smb后,中文目录乱码问题 //$smb_server/share /mnt/nas_share cifs credentials/root/.smbcredentials,iocharsetutf8 0 0默认通过以上命令挂载smb,但是在查看文件目录时,中文乱码 解决问题方式: de…

BLDC无感方波控制

BLDC无感控制 反电动势过零检测反电动势检测方法比较器模式采样过零信号闭环的建立 BLDC 方波启动技术转子预定位电机的外同步加速电机运行状态的转换 程序部分 反电动势过零检测 它的主要核心就是通过检测定子绕组的反电动势过零点来判断转子当前的位置。 三相六状态 120通电…

JavaScript -【第二周】

文章来源于网上收集和自己原创,若侵害到您的权利,请您及时联系并删除~~~ 理解什么是流程控制,知道条件控制的种类并掌握其对应的语法规则,具备利用循环编写简易ATM取款机程序能力 运算符语句综合案例 1. 运算符 算术运算符赋值运…

【python爬虫】批量识别pdf中的英文,自动翻译成中文上

不管是上学还是上班,有时不可避免需要看英文文章,特别是在写毕业论文的时候。比较头疼的是把专业性很强的英文pdf文章翻译成中文。我记得我上学的时候,是一段一段复制,或者碰到不认识的单词就百度翻译一下,非常耗费时间。本文提供批量识别pdf中英文的方法,后续文章实现自…

简明易懂:Python中的分支与循环

文章目录 前言分支结构if 语句:单一条件判断else语句:提供备选方案elif 语句:多条件判断嵌套的分支结构:复杂条件逻辑 循环结构for循环:遍历序列range()函数与for循环while循环:条件重复循环控制&#xff1…

C++------vector【STL】

文章目录 vector的介绍及使用vector的介绍vector的使用 vector的模拟实现 vector的介绍及使用 vector的介绍 1、vector是表示可变大小数组的序列容器。 2、就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数…

【rust/egui】(八)使用panels给你的应用划分功能区块

说在前面 rust新手,egui没啥找到啥教程,这里自己记录下学习过程环境:windows11 22H2rust版本:rustc 1.71.1egui版本:0.22.0eframe版本:0.22.0上一篇:这里 panel是啥 panel是ui上的一块区域&…

【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate

目录 一.基础概念 二.数据库的管理 1.创建数据库 2.删除数据库 二.集合的管理 1.显示所有集合 2.创建集合 3.删除当前集合 4.向集合中插入元素 三.文档的管理 1.文档插入 2.文档的更新 3.文档的删除 4.文档查询 (1)查询基本语法&#xff1…

不同路径 II【动态规划】

不同路径 II 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。那么从左上…

JavaScript设计模式(四)——策略模式、代理模式、观察者模式

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,正逐渐往全干发展 📃个人状态: 研发工程师,现效力于中国工业软件事业 🚀人生格言: 积跬步…

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能,怎么实现,提供一份整体逻辑:包括主函数和功能函数 主函数逻辑: 1. 读图,两张rgb(cv::imread) 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数:keypoints…

githubPage部署Vue项目

github中新建项目 my-web (编写vue项目代码) myWebOnline(存放Vue打包后的dist包里面的文件) 发布流程 (假设my-web项目已经编写完成)Vue-cli my-web vue.config.js文件中 const { defineConfig } require(vue/cli-service)…