学习Python模块导入机制与大型项目的规范-Python教程

资源魔 47 0
Python视频教程栏目明天为各人引见学习Python模块导入机制与年夜型名目的标准。

媒介

正在咱们平时工程里应用Python的进程中,常常需求处理各个模块的导入成绩,并且也经常遇到援用门路查找没有到、穿插导入模块等等成绩,故写这篇文章,旨正在讲述Python的模块导入机制以及咱们平常年夜型名目中应该遵照的模块导入标准

Python模块导入

一样平常编程中,为了可以复用写过的代码逻辑,咱们城市把这些代码封装成为模块,需求用到的时分能够间接导入复用,以便进步咱们的开发效率。 module能界说函数、类、变量,也能蕴含可执行的代码。module起源有3种: ①Python内置的模块(规范库); ②第三方模块; ③自界说模块;

导入原理

模块的导入普通是正在文件头应用import要害字,import一个模块相称于先执行了一次这个被导入模块,而后正在本定名空间建设一个与被导入模块定名空间的联络,相称于正在本定名空间新建了一个变量,这个变量称号是被导入模块的称号,指向被导入模块的定名空间。以是导入的这个模块相称于一个变量,因而屡次导入同一个模块只有第一次导入的时分会被执行(后续导入会判别到这个模块变量已存正在以是没有执行)

门路查找机制

每个导入的模块城市正在Python内置字典sys.modules中,Python一启动,它将被加载正在内存中,当咱们导入新modules,sys.modules将主动记载下该module。 Python的模块查找门路的机制是:

  1. 查找sys.path中的一切门路下能否有该模块,有则开拓新空间加载该模块;
  2. 查看sys.modules中能否有内置包或已装置的第三方包,有则开拓新空间加载该模块;

以是关于咱们本人编写的模块,假如封装并公布到了PyPi,则能够用pip install间接装置,并正在启动时加载正在内存中,经过sys.modules能够查看到 而关于仅需求正在本名目中复用的模块,咱们正在复用代码中将其门路退出到sys.path中,一样能够援用到该模块。

相对门路导入

一切的模块import都从“根节点”开端。根节点的地位由sys.path中的门路决议,名目的根目次普通主动正在sys.path中。假如心愿顺序能处处执行,需手动修正sys.path

import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#名目根目次所正在的相对门路sys.path.append(BASE_DIR)import A, B #导入A、B包复制代码

绝对门路导入

只关怀绝对本人以后目次的模块地位就好。不克不及正在包(package)的外部间接执行(会报错)。不论根节点正在哪儿,包内的模块绝对地位都是正确的。

#from . import b2 #这类导入形式会报错,只有正在包外部间接执行的时分才能够这样导入。import b2#正确b2.print_b2()复制代码

Python模块导入常见成绩

  • 独自import某个包称号时,没有会导入该包中所蕴含的一切子模块 处理方法:导入的包中也蕴含了其余包的导入,此时需求正在每一个包的init.py文件中导入该包下的一切模块,最下层才能够间接援用最上层的包的类以及办法

init文件

当一个文件夹下有init.py时,意为该文件夹是一个包(package),其下的多个模块(module)形成一个全体,而这些模块(module)均可经过同一个包(package)导入其余代码中。 此中init.py文件 用于组织包(package),不便治理各个模块之间的援用、管制着包的导入行为。

该文件能够甚么内容都没有写,即为空文件(为空时,仅仅用import [该包]方式 是甚么也做没有了的),存期近可,相称于一个标志。

正在python3中,即便包下不init.py文件,import 包依然没有会报错,而正在python2中,包下肯定要有该文件,不然import 包会报错

all变量

all 是一个首要的变量,用来指定此包(package)被import *时,哪些模块(module)会被import进【以后作用域中】。没有正在all列表中的模块没有会被其余顺序援用。能够重写all,如 all= [‘以后所属包模块1名字’, ‘模块1名字’],假如写了这个,则会按列表中的模块名进行导入

name变量

正在包外部间接运转时,包的name == 'main',然而正在内部导入包是,能够经过

if __name__ == '__main__':复制代码

来防止完成包外部调试时的逻辑

轮回导入

当两个模块A以及B之间互相import时,就会呈现轮回导入的成绩,此时顺序运转会报错:can not import name xxx,如:

# a.pyprint('from a.py')from b import x

y = 'a'复制代码
# b.pyprint('from b.py')from a import y

x = 'b'复制代码

咱们来剖析一下这类谬误是怎样呈现的:

  1. 正在sys.modules中查找 符号“module b”;
  2. 假如符号“module b”存正在,则取得符号“module b”对应的module工具; 从的dict中取得 符号“x”对应的工具。假如“x”没有存正在,则抛出异样“ImportError: cannot import name ‘x’”
  3. 假如符号“module b”没有存正在,则创立一个新的 module工具。不外此时该新module工具的dict为空。而后执行module b.py文件中的语句,填充的dict

因而正在a.py中执行from b import x的程序就是1->3,先引入b,b外面from a import y由相称于执行了a.py,程序是1->2,由于此时b曾经引入以是没有会执行3,2中无奈找到x工具,由于引入b时还没执行到x='b'这一步,以是报错了

处理方法

  1. 提早导入,把import语句写正在办法/函数里,将它的作用域限度正在部分;
  2. 顶层先引入模块,再把from x import y改为import x.y方式;
  3. 其实呈现轮回援用成绩的基本缘由是顺序设计没有正当,每一个包都应该由下层应用的模块去导入,而不该该正在包与包之间各类互相导入,以是应该更改代码规划,可兼并或别离竞争资本;

年夜型名目中Python模块导入标准

别离模块,将同一种别的模块放正在同一目次下,构成种别清楚的目次架构,如:

  1. 每个模块目次都要写init.py文件,能够同时界说all限定可导入的范畴;
  2. 源码根目次能够界说BASE_DIR,限定好根目次门路,启动py文件能够用相对门路导入各个模块,将须要模块都退出到sys.path中;
  3. 各个效劳之间(例如model需求引入co妹妹on的模块办法),能够经过绝对门路援用模块;
  4. 顺序设计时防止轮回导入,可由挪用者(效劳文件)作为下层第三方引入需求的各个模块,这样就能够缩小各个模块的互相导入。

更多相干收费学习保举:python视频教程

以上就是学习Python模块导入机制与年夜型名目的标准的具体内容,更多请存眷资源魔其它相干文章!

标签: Python python教程 python编程 python使用问题 导入机制 大型项目

抱歉,评论功能暂时关闭!