python-day21_包_跨目录调用_异常处理
1,
# 把解决一类问题的模块放在同一个文件夹里 —— 包
# import os
# os.makedirs('glance/api')
# os.makedirs('glance/cmd')
# os.makedirs('glance/db')
# l = []
# l.append(open('glance/__init__.py','w'))
# l.append(open('glance/api/__init__.py','w'))
# l.append(open('glance/api/policy.py','w'))
# l.append(open('glance/api/versions.py','w'))
# l.append(open('glance/cmd/__init__.py','w'))
# l.append(open('glance/cmd/manage.py','w'))
# l.append(open('glance/db/models.py','w'))
# l.append(open('glance/db/__init__.py','w'))
# map(lambda f:f.close() ,l)
1),包的目录下面,以及子目录下面,都应该有__init__.py文件
2),当包的根目录被导入,根目录下的__init__.py被执行,在__init__.py内执行子目录的导入,以及根目录下py文件的导入
3),子目录下也有__init__.py,子目录的__init__.py,执行本地目录内py文件的导入
4),包的导入有sys.path来指定根路径,根目录和子目录的__init__.py,以当前python程序的执行目录为根目录
只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
https://www.cnblogs.com/eva-j/articles/7292109.htm
# 使用绝对路径 不管在包内部还是外部 导入了就能用
# 不能挪动,但是直观
# from dir import glance
# glance.api.policy.get()
# 相对路径
# 可以随意移动包,只要能找到包的位置,就可以使用包里的模块
# 包里的模块如果想调用其它模块的内容只能使用相对路径,但直接以包内的模块为根来运行,路径会不支持
路径:
glance//api//policy.py
glance--__init__.py内容
from . import api from . import cmd from . import db
api--__init__.py内容
from . import policy from . import versions
程序开发规范:
bin\start.py if __name__ == '__main__': core.main()
core\core.py
shopping()
pay()
main()
2,
程序结构如下:
-- src
|-- mod1.py
|-- lib
| |-- mod2.py
|
|-- sub
| |-- test2.py
这里想要实现test2.py调用mod1.py和mod2.py ,做法是我们先跳到src目录下面,直接可以调用mod1,然后在lib上当下建一个空文件__init__.py ,就可以像第二步调用子目录下的模块一样,通过import lib.mod2进行调用了。具体代码如下:
import sys sys.path.append("..")
os.chdir('..') import mod1 import mod2.mod2
3,异常处理
# try:
# print('1111')
# # 1/0
# print('2222')
# # name
# # 2+'3'
# # [][3]
# # {}['k']
# ret = int(input('number >>>'))
# print(ret*'*')
# except ValueError:
# print('输入的数据类型有误')
# except Exception:
# print('你错了,老铁')
# else:
# print('没有异常的时候执行else中的代码')
# print('===========')
# def func():
# try:
# f = open('file','w')
# ''''''
# return True
# except:
# return False
# finally:
# print('执行finally了')
# f.close()
#
# print(func())
# 程序一旦发生错误,就从错误的位置停下来了,不在继续执行后面的内容
# 使用try和except就能处理异常
#try是我们需要处理的代码
#except 后面跟一个错误类型 当代码发生错误且错误类型符合的时候 就会执行except中的代码
#except支持多分支
#有没有一个能处理所有错误的类型 : Exception
# 有了万能的处理机制仍然需要把能预测到的问题单独处理
# 单独处理的所有内容都应该写在万能异常之前
# else : 没有异常的时候执行else中的代码
# finally : 不管代码是否异常,都会执行
# finally和return相遇的时候,即使return在前面结束,依然会执行finally后面的代码
# 函数里做异常处理用,不管是否异常,都去做一些收尾工作
try:
print('1111')
# 1/0
print('2222')
# name
# 2+'3'
# [][3]
# {}['k']
ret = int(input('number >>>'))
print(ret*'*')
except Exception as error:
print('你错了,老铁',error)