三、with关键字

3、with关键字

  • 对于系统资源如文件、数据库连接、socket而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。
  • 比如python程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则极端情况下会出现"Too many open files"的错误,因为系统允许你打开的最大文件数量是有限的
  • 同样,对于数据库,如果连接过多而没有及时关闭的话,就可能出现"Can not connect to MySQL server Too many connections",因为数据库连接是一种非常昂贵的资源,不可能无限制的被创建

来看看如何正确的关闭一个文件

  • 普通版:
def m1():
    f = open('zzw.txt','w')
    f.write('python')
    f.close()

这样写有一个潜在的问题,如果在调用write的过程中,出现了异常而导致后续代码无法继续执行,colse方法无法被正常调用,因此资源就会一直被该程序占用者释放

  • 进阶版:
def m2():
    f = open('zzw.txt','w')
    try:
        f.write('python')
    except Exception:
        print('errpor')
    finally:
        f.close()

改良版本的程序是对可能发生异常的代码进行try捕获,使用try/finally语句,finally语句中的代码是无论如何都会被执行的,所以文件一定会被关闭

  • 高级版
def m3():
    with open('zzw.txt','w') as f:
        f.write('python')
  1. 语法:

    with 对象 as 别名:

  2. 案例:

try:
	with open('zzw.txt',mode = 'r',encoding = 'utf8') as file:
		file.read()	#不需要再手动的关闭文件,with关键字会帮助我们关闭
except Exception:
	print('文件未找到')

3.1 上下文管理器

with语句实质上就是一个上下文管理器,with语句后的对象都会有__enter__()__exit__()方法,在进入到上下文时,会自动调用__enter__()方法,程序正常执行完成,或者出现异常中断的时候,都会调用__exit__()方法

class Zzw(object):
    def __enter__(self):
        pass
    def __exit__(self,exc_type,exc_val,exc_tb):
        pass

with Zzw() as d:
    print(d)	#None
    #d代表的是__enter__()方法的返回值
posted @ 2021-06-02 09:54  zzwYYYYYY  阅读(94)  评论(0)    收藏  举报