Python中with - as用法
HDUZN

最常见到的用到with as的地方,比如打开文件的时候:

1
2
3
with open("1.txt") as file:
data = file.read()
print(data)

为什么要用with as,可以理解为是简化版的 try except语句,可以处理异常。

为什么要用with as

比如,上面的代码,不用with as 写法,一般这样写:

1
2
3
4
file = open("1.txt")
data = file.read()
print(data)
file.close

这样就会有个问题:当”1.txt”文件不存在的时候,就会报异常,就需要处理异常,或者先判断文件是否存在。你就可能需要这样写:

1
2
3
4
5
6
7
8
try:
file = open('1.txt')
data = file.read()
print(data)
except Exception as e:
print(e)
finally:
file.close()

而用with as就不需要这么麻烦了,能自动处理异常。

with as语句结构如下:

1
2
with expression as [variable]:
# 代码块,对[variable]的操作等

with 工作原理

with所求值的对象必须有一个enter()方法,一个exit()方法。

  • 1.紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量;
  • 2.当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。所以也不用close()了。

比如下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Sample:
def __enter__(self): # 3
print("In __enter__()")
return "Foo"

def __exit__(self, exc_type, exc_value, exc_trace): # 5
print("In __exit__()")

def get_sample():# 2
return Sample()

with get_sample() as sample: # 1
print("sample:", sample) # 4

代码输出结果如下:

1
2
3
In __enter__()
sample: Foo
In __exit__()

代码执行过程:

  • 1.with as语句中sample=get_sample(),调用get_sample()方法;
  • 2.返回一个Sample()对象;
  • 3.调用Sample()对象的__enter__()方法,输出In __enter__(),并return “Foo”;
  • 4.执行with下面代码块的语句,print("sample:", sample)
  • 5.with执行完后,调用Sample()对象的__exit__()方法,输出In __exit__()

exit()方法中有3个参数:exc_typeexc_valueexc_trace,是在异常处理中用的。

exc_type:错误的类型
exc_value:错误类型对应的值
exc_trace:代码中错误发生的位置
可以在exit()方法中print打印出来。

  • 本文标题:Python中with - as用法
  • 本文作者:HDUZN
  • 创建时间:2022-05-20 21:55:14
  • 本文链接:http://hduzn.cn/2022/05/20/Python中with-as用法/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论