在“with”块内的控制台中以交互方式逐行执行代码
Execute code line by line interactively in console inside `with` block
在控制台中进行交互式测试时,有时我会使用 with
语句。但是,因为它们增加了缩进,提示从 >>>
变为 ...
并且执行停止,直到我 return 到最低缩进。它对函数定义有意义,因为代码实际上并不在函数定义内执行。但是还有循环(第一次迭代可以在循环被完整描述之前执行)、条件语句、try
、with
...
有没有办法实现这样的执行?或者我是否必须像这样在上下文管理器的界面上手动操作:
>>> 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()
是 identical 它对这段代码的实现:
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!
在控制台中进行交互式测试时,有时我会使用 with
语句。但是,因为它们增加了缩进,提示从 >>>
变为 ...
并且执行停止,直到我 return 到最低缩进。它对函数定义有意义,因为代码实际上并不在函数定义内执行。但是还有循环(第一次迭代可以在循环被完整描述之前执行)、条件语句、try
、with
...
有没有办法实现这样的执行?或者我是否必须像这样在上下文管理器的界面上手动操作:
>>> 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()
是 identical 它对这段代码的实现:
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!