在"with"块内的控制台中以交互方式逐行执行代码



在控制台中进行交互测试时,有时我会使用with语句。但是,由于它们增加了缩进,提示从>>>变为...,并且执行停止,直到我返回到最低缩进。这对于函数定义来说是有意义的,因为代码实际上并不是在函数定义内部执行的。但是还有循环(第一次迭代可以在循环被完全描述之前执行(、条件语句、trywith。。。

有没有办法实现这种执行?或者我必须手动操作上下文管理器的界面,比如:

>>> cm = open("E:/test.txt")
>>> f = cm.__enter__()
>>> f.read()
'contents of the file'
>>> cm.__exit__()

控制台在with语句中一行接一行地执行是没有意义的。许多上下文管理器会注意抑制with块内发生的某些类型的异常,而许多其他上下文管理器则会注意在引发某些类型的例外之前执行某种清理操作。open就是一个很好的例子——如果在python读取文件时发生某种异常,使用open作为上下文管理器将确保在python引发异常之前再次关闭文件。


此代码:

with open("E:/test.txt", "r") as f:
var = f.read()

与此代码实现的功能相同:

try:
f = open("E:/test.txt", "r")
var = f.read()
finally:
f.close()

如果您在交互式控制台中执行代码,那么使用";老式的";预上下文管理器打开和读取文件的方式,但没有异常处理。


交互式控制台之外的良好python实践:

with open("E:/test.txt", "r") as f:
var = f.read()  # file is automatically closed as the `with` block ends

"老式的";在交互式控制台中逐行执行代码的解决方案(在实际脚本中很危险——没有异常处理!(:

>>> f = open("E:/test.txt", "r")
>>> var = f.read()
>>> f.close()  # Remember to manually close the file, since we're not using a `with` statement!

最新更新