day03.25

两个文件的循环导入问题

两个模块循环导入的时候极有可能出现某个名字还没有被创建就使用的情况导致报错,因此应该尽量避免出现循环导入的问题。

如果确实需要使用循环导入,那么需要确保双方使用的名字都必须在导入过程之前被提前定义好。

有两种方式解决:

  • 将导入模块的句式写在定义名字的下面
  • 将导入模块的句式写在函数体代码内

判断文件类型

判断文件是否是导入文件和执行文件,用一个内置变量__name__。

用__name__来区分导入代码和测试代码:

当__name__所在的文件是执行文件的时候 结果是__main__;当__name__所在的文件是被导入文件时候 结果是文件名(模块名)。

if __name__ == '__main__':

用此if句式时,当前文件是执行文件的时候才会执行的子代码块。

模块的查找顺序

  1. 先从内存空间中查找
  2. 再从内置模块中查找
  3. 最后去sys.path查找(类似于环境变量)
  4. 如果三个地方都没有找到,会直接报错

从内存空间中查找:

import md1
import time
time.sleep(15)  # 睡眠期间将md1文件删除
print(md1.name)

从内置模块中查找:

import time
print(time)
print(time.time())
# 在创建py文件时候一定不要跟模块名(内置、第三方)冲突,否则会报错。

验证在验证sys.path当中查找:

复制代码
# 当内存中和内置中都没有要查找的模块时,就会去下面的路径中挨个查找
import sys

print(sys.path)  # 结果是一个列表 里面存放了很多路径
'''
['/Users/jiboyuan/PycharmProjects/day18', 
'/Users/jiboyuan/PycharmProjects/day18', 
'/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display', 
'/Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip'...]
sys.path中虽然有很多路径,第一个其实就是执行文件所在的路径,查找模块的时候只需要站在执行文件所在的路径查看即可
'''
复制代码

如何解决在sys.path当中的文件模块

复制代码
# 主动添加sys.path路径(类似于添加环境变量)
import sys
sys.path.append(r'/Users/jiboyuan/PycharmProjects/day18/aaa')
import mddd
print(mddd.name)
"""
pycharm会自动将项目目录所在的路径添加到sys.path中
"""
# 利用from...import...句式指名道姓的查找
from aaa import mddd  # 从文件夹aaa中导入mddd模块
print(mddd.name)
from aaa.bbb.ccc import mm  # 通过点的方式进入下一层目录
print(mm.name)
复制代码

绝对导入与相对导入:

note:无论导入的句式是在执行文件中还是在被导入文件中;在导入模块的时候一切查找模块的句式都是以执行文件为准!!!

绝对导入:

按照执行文件所在的路径一层层往下查找

相对导入:

相当导入打破了必须参照执行文件的所在路径的要求,只需要考虑当前模块所在的路径然后使用特殊符号.去查找其他模块即可。

from . import a

# 相对导入只能在被导入文件中使用,不能在执行文件中使用
'''
.表示当前路径
..表示上一层路径
../..表示上上一层路径
'''

包:

包就是一个内部含有__init__.py的文件夹。

包也是多个模块的结合体,其内部存放了多个模块文件。

创建一个__init__.py文件,在pycharm当中会直接生成一个包。

复制代码
# 在导入包的时候,索要名字其实是跟包里面的__init__.py要
'''
方式1:
如果想直接通过包的名字使用包里面所有的模块,那么需要在__init__.py中提前导入
上述方式的好处在于__init__可以提前帮你准备好可以使用的名字
'''

'''
方式2:
也可以直接忽略__init__的存在使用绝对导入即可
上述方式的好处在于不需要考虑包的存在,直接当成普通文件夹即可
'''
复制代码

软件开发目录规范

  • bin文件夹

用来存放程序的启动文件;start.py

  • conf文件夹

用来存放程序的配置文件;settings.py

  • core文件夹

用来存放程序的核心业务,是实现程序功能的最重要的代码文件;src.py

  • lib文件夹

用来存放程序公共的功能;common.py

  • db文件夹

用来存放程序的数据;userinfo.txt

  • log文件夹

用来存放程序的日志记录;log.log

  • readme文本文件

用来存放程序的说明、广告等额外的信息

  • requirements.txt文本文件

用来存放程序需要使用的第三方模块及对应的版本

posted @   *sunflower*  阅读(65)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示