Python day17:模块2

今日内容:
1.循环导入问题
2.py文件两种用途
3.模块的搜索路径优先级
4.软件开发的目录规范

一、循环导入问题:

# m1.py
print("导入m1")
from m2 import y 
x = 1
# m2.py
print("导入m2")
from m1 import x
y = 2
# run.py
import m1

该程序会直接报错,因为我们在导入m1时,还没运行到x=1,就导入了m2,此时m2需要引用x,而x还没有定义。反之对y也是如此,m1要引用m2的y,此时m2还没来得及定义y

'''
解决方法1:将导入模块语句放在定义变量后,缺点是使得程序的可读性变差,因为我们导入模块一般都在开头
'''
#m1.py
print('正在导入m1')

x='1'

from m2 import y

#m2.py
print('正在导入m2')
y='2'

from m1 import x
'''
推荐方法
解决方法2:将导入模块的代码写到函数中,在调用时,才去加载模块
'''
#m1.py
print('正在导入m1')

def f1():
    from m2 import y
    print(x,y)

x = '1'

# f1()

#m2.py
print('正在导入m2')

def f2():
    from m1 import x
    print(x,y)

y = '2'

#run.py
import m1

m1.f1()
'''

二、py文件的两种用途

在一个py文件中,可以使用__name__的方法查看自己的属性
1.当文件被当成脚本直接运行的时候,__name__的值为__main__
2.当文件被当成模块导入时候,__name__的值为模块名称,如导入spam.py文件,__name__ =  'spam'

三、模块搜索路径与查找优先级:
1.先从内存中已经导入的模块里找
2.然后再查找内置的模块
3.最后去sys.path列表中存放的多个文件夹里依次检索

利用sys模块下的sys.path可以获取一个列表,这个列表就是存放python查找导入模块文件夹的列表

(1) 先从内存中已经导入的模块里找

import mmm
mmm.f1()

import time
time.sleep(15)

print('='*50)
import mmm
mmm.f1()

(2) 然后再查找内置的模块

'''
sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员
导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到
了缓冲的作用。当某个模块第一次导入,字典sys.modules将自动记录该模块。当第
二次再导入该模块时,python会直接到字典中查找,从而加快了程序运行的速度。
'''
import sys
print(sys.modules)

import sys
print(sys.path)


当前执行文件所在的文件夹
import logging
print(logging)

(3) 最后去sys.path列表中存放的多个文件夹里依次检索

'''
当我们有第三方模块或者自定义模块需要导入时,有下面两种方法
'''
示例1:
import sys
print(sys.path)
sys.path.append(r'D:\python全栈15期\aaa\bbb')

import ccc

ccc.f1()

示例2:
import sys
print(sys.path)
import aaa.bbb.ccc as c
c.f1()

from aaa.bbb import ccc
ccc.f1()

四、软件开发的目录规范
一般要有一个启动程序,如start.py,其中尽量不包含逻辑代码,只用来启动程序
对于一个简单的项目,还需要包含
1.存放核心代码的文件
2.存放公用功能的模块
3.配置文件
4.日志文件


image.png

将启动文件直接放到程序目录下,会使我们程序运行时,sys.path将主程序的文件路径加载进去,方便其他文件导入模版

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。