模块导入与编写规范
Posted h1227
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模块导入与编写规范相关的知识,希望对你有一定的参考价值。
from...import ...
from...import...与import语句基本一致,唯一不同的是:使用import foo(模块名)导入模块后,引用模块中的名字都需要加上foo.(模块名点)作为前缀,
而使用from foo import x,get,change,Foo(变量名或函数名)则可以在当前执行文件中直接引用模块foo中的名字。
导入模块发生的三件事情:
1、产一个模块的名称空间
2、运行foo.py将运行过程中产生的名字都丢到模块的名称空间去
3、在当前名称空间拿到一个名字,该名字与模块名称空间中的某一个内存地址
from foo import x x指向的就是foo中x映射关系的那个值的内存地址
impot导入模块在使用时必须加前缀"模块."
优点:肯定不会与当前名称空间中的名字冲突
缺点:加前缀显得麻烦
from...impot...导入模块在使用时不用加前缀
优点:代码更精简
缺点:容易与当前名称空间混淆
from foo import * (导入模块中所有的名字)
*代表导入模块foo的所有公有属性、方法、类
如果指定了__all__则导入*的时候只能用all里面的变量、方法、类
from foo import get as g(也可以用as起别名)
通常在被导入的名字过长时采用起别名的方式来精简代码,另外为被导入的名字起别名可以很好地避免与当前名字发生冲突,
还有很重要的一点就是:可以保持调用方式的一致性,例如我们有两个模块json和pickle同时实现了load方法,
作用是从一个打开的文件中解析出结构化的数据,但解析的格式不同,可以用下述代码有选择性地加载不同的模块
if data_format == ‘json‘:
import json as serialize #如果数据格式是json,那么导入json模块并命名为serialize
elif data_format == ‘pickle‘:
import pickle as serialize #如果数据格式是pickle,那么导入pickle模块并命名为serialize
data=serialize.load(fn) #最终调用的方式是一致的
循环导入问题
循环导入问题指的是在一个模块加载/导入的过程中导入另外一个模块,而在另外一个模块中又返回来导入第一个模块中的名字,
由于第一个模块尚未加载完毕,所以引用失败、抛出异常,究其根源就是在python中,同一个模块只会在第一次导入时执行其内部代码,
再次导入该模块时,即便是该模块尚未完全加载完毕也不会去重复执行内部代码
解决方案:方案一:导入语句放到最后,保证在导入时,所有名字都已经加载过
方案二:导入语句放到函数中,只有在调用函数时才会执行其内部代码
注意:循环导入问题大多数情况是因为程序设计失误导致,上述解决方案也只是在烂设计之上的无奈之举,
在我们的程序中应该尽量避免出现循环/嵌套导入,如果多个模块确实都需要共享某些数据,可以将共享的数据集中存放到某一个地方,
然后进行导入,不要进行屎上雕花的操作
搜索模块的路径与优先级
1):内置模块
2):sys.path中定义的路径 也可以将模块的文件路径加入到执行文件定义的路径中 ,可以用sys.path.append(路径)添加
在导入一个模块时,如果该模块已加载到内存中,则直接引用,否则会优先查找内置模块,然后按照从左到右的顺序
依次检索sys.path中定义的路径,直到找模块对应的文件为止,否则抛出异常。sys.path也被称为模块的搜索路径,
它是一个列表类型
编写一个规范的模块
我们在编写py文件时,需要时刻提醒自己,该文件既是给自己用的,也有可能会被其他人使用,因而代码的可读性与易维护性显得十分重要,
为此我们在编写一个模块时最好按照统一的规范去编写,如下
#!/usr/bin/env python #通常只在类unix环境有效,作用是可以使用脚本名来执行,而无需直接调用解释器。
"The module is used to..." #模块的文档描述
import sys #导入模块
x=1 #定义全局变量,如果非必须,则最好使用局部变量,这样可以提高代码的易维护性,并且可以节省内存提高性能
class Foo: #定义类,并写好类的注释
‘Class Foo is used to...‘
pass
def test(): #定义函数,并写好函数的注释
‘Function test is used to…‘
pass
if __name__ == ‘__main__‘: #主程序
test() #在被当做脚本执行时,执行此处的代码
以上是关于模块导入与编写规范的主要内容,如果未能解决你的问题,请参考以下文章