3.6 模组
模组,一般称为类库或模块。分为标准模块和第三方库。
3.6.1 调用模块
import time
from time import time, sleep
from time import * # 不用每个函数加time,但不推荐这样做
from time import sleep as sys_sleep # 如果导入的函数刚好与自己定义的重复,可以用as对导入函数重命名。
3.6.2 自定义模块--同目录调用
project1
calculator.py
test.py
calculator.py
def add(a,b):
return a+b
test.py
from calculator import add # 导入calculator文件中的add函数
print(add(4,5))
3.6.3 跨目录调用
project2
module
calculator.py
test
test.py
import sys
from os.path import dirname,abspath
project_path = dirname(dirname(abspath(__file__))) # __file__用于获取文件所在的路径, dirname()嵌套使用
sys.path.append(project_path + "\\module")
from calculator import add
print(add(2,3))
3.6.4 编写自测代码
def add(a,b):
return a + b
if __name__ == '__main__': # 表示当模块被直接运行时,下面的代码块将被运行;当模块被其他程序文件调用时,下面模块不被运行
# 自测代码
c = add(3,5)
print(c)
3.7 异常
Python用异常对象来表示异常情况。在遇到错误后,异常对象引发异常。如果异常对象并未被处理或捕捉到,则程序会用回溯(traceback)来终止程序。
3.7.1 认识异常
try except语句来捕捉并处理异常。
try:
open("abc.txt",'r')
except BasException as msg:
print(msg)
官网文档列出来的常见exception
https://docs.python.org/zh-cn/3/library/exceptions.html?highlight=baseexception#BaseException
Exception | 所有内置的非系统退出类异常都派生自此类。所有用户自定义异常也应该派生自此类 |
AssertionError | 当assert语句失败时将被引发 |
FileNotFoundError | 是OSError的子类,将所请求的文件或目录不存在时将被引发 |
AttributeError | 当属性引用或赋值失败时将被引发(当一个对象根本不支持属性引用或赋值时则将引发TypeError) |
OSError | 在一个系统函数返回系统相关的错误时将被引发,例如 文件未找到 或磁盘已满 |
NameError | 当某个局部或全局名称未找到时将被引发 |
IndexError | 当序列抽取超出范围时将被引发(如果指定索引不是整数则TypeError会被引发) |
SyntaxError | 当解析器遇到语法错误时引发。这可以发生在import语句对内置函数的调用,或读取原始脚本或标准输入的时候。 |
KeyboardInterrupt | 当用户按下中断键(通常为control+c 或 delete)将被引发。该异常继承自BaseException以确保不会被处理Exception的代码意外捕获,这样可以避免退出解释器。(Exception会退出,BaseException不会?) |
TypeError | 当一个操作或函数被应用于类型不适当的对象时将被引发。传入参数的类型错误(要求int时传入list)应当导致TypeError,但传入参数的值错误(不要求范围之外)则应当导致 ValueError |
3.7.2 更多异常用法
try:
except Error as msg:
else: # 没有异常时执行
try:
except Error as msg:
finally: # 不管是否有异常,都会被执行
try 工作原理是:(记得有面试会出这种问题!)
1 首先,执行try子句(try和except关键字之间的多行语句)
2 如果没有触发异常,则跳过except子句,执行后面的语句
3 如果在执行try子句时发生了异常,则跳过该子句中剩下的部分(该点需要注意)。如果异常的类型与except关键字后指定的异常相匹配,则会执行except子句,然后跳到try/except代码块之后继续执行。
4 如果发生的异常与except子句中指定的异常不匹配,则它会被传递到外部try语句中;如果没有找到处理程序,则它是一个未处理异常且执行将终止并输出如上所示的消息。
try:
print('1')
open('abc.txt','r')
print("2")
except BaseException as msg:
print("异常了!")
print(msg)
print('3')
可见发生的异常与except子句指定的异常匹配
那如果将BaseException换成其它的异常,如TypeError
try:
print('1')
open('abc.txt','r')
print("2")
except TypeError as msg:
print("异常了!")
print(msg)
print('3')
从结果可以看出:异常不匹配,except子句不再执行。然后传递到外部try语句中。但后面的是否找到处理程序(try原理第4步),是指异常的语句后面可能有try-except? 尝试一下。
def abc():
try:
print('1')
open('abc.txt','r')
print("2")
try:
abc()
except FileNotFoundError as info:
print(info)
print('4')
except TypeError as msg:
print("异常了!")
print(msg)
print('3')
abc()
没什么区别啊。没弄明白第4步的 如果找到处理程序,和 没有找到处理程序,区别是什么。
3.7.3 抛出异常
def say_hello(name=None):
if name is None:
raise NameError('"your name" cannot be empty')
else:
print('hello, %s' %name)
say_hello()
从结果可见,确实抛出了异常,而且错误信息就是我们设置的语句:"your name" cannot be empty
那么NameError是固定的,还是可以随便起名么?
def say_hello(name=None):
if name =='ssd':
raise NameEMError('"your name" cannot be empty')
else:
print('hello, %s' %name)
say_hello()
从结果可见,NameError不能随便起名
书中这样写到: raise只能使用Python提供的异常类,如果想要raise使用自定义异常类,则自定义异常类需要继承Exception类。
但Python官网中关于自定义异常,尤其是如何继承Exception类,没有详细的描写,暂时放弃这块。
https://docs.python.org/zh-cn/3/tutorial/errors.html?highlight=raise#user-defined-exceptions
def say_hello(name=None):
if name is None:
raise NameError('"name" cannot be empty')
elif name == 'sb':
raise NameError('"name" contains not allowed word')
else:
print('hello, %s' %name)
say_hello('sb')
3.8 新手常犯的错误
1 要用4个空格或tab键进行缩进。但在一个语句体中不要混合使用空格和tab
2 大部分方法两边带的下画线是双下画线
3 项目不要都创建在Python的安装目录中
4 Python程序文件路径中,尽量避免出现中文或空格。可能导致部分编辑器无法运行。
4 创建的目录与文件名,不要与引用类库同名。
标签:name,--,except,try,Python,Selenium3,print,异常,msg From: https://www.cnblogs.com/guohui2022/p/16864345.html