如何解决“with”语句中的交互模式
With statement context managers 有很多方便的用途。但是,它们在交互式 shell 中可能不方便,因为整个 with
语句是作为一个整体块执行的,例如:
with open('test.txt','r') as fin:
print(fin.readline()) # The result does not immediately output to the console
for i in range(10): # I may want to choose the number depending on the prevIoUs line's output
# (or do something else entirely),but I cannot
print(fin.readline()) # Or any other sort of processing
如图所示,例如,如果我想在决定如何处理文件之前“探索”文件的内容,这可能是一个问题。我通常最终做的是在处理之前将整个文件读入一个字符串,或者使用多个 with
语句多次打开文件,但显然这两种解决方案都有局限性(例如文件可能太大到读入内存,或者有问题的上下文管理器可能根本不是一个文件)。
更通用的解决方案是避开 with
语句而使用 fin.close()
。但是,我使用的某些上下文管理器类可能不会在其公共接口中提供 close()
方法。当然,我可以明确地写出 mycontextmanager.__exit__(None,None,None)
,但这似乎很尴尬。此外,我也完全有可能忘记关闭上下文管理器,这对文件来说没什么大不了的,但对于例如,可能会更成问题。互联网会话。
我也可以使用 finalizers 来确保事情被关闭,但是依靠垃圾收集器来处理内存泄漏以外的任何事情似乎是一种不稳定的做事方式,所以我觉得终结器应该是一个补充解决方案充其量。
那么对于在交互式 shell 中使用上下文管理器的问题,有没有更优雅的解决方案?我自己的上下文管理器类是否应该始终提供类似 close()
的方法作为一种好的做法?
解决方法
通过调试器运行交互式会话。
将代码作为脚本运行,但将 breakpoint()
放在感兴趣的位置。
有关调试器文档,请参阅 here。
-
s
步 -
n
(下一步)跳过函数 -
c
(继续)恢复执行 -
p <name>
显示名称的值 -
! <statement>
执行语句 -
display <name>
也很有用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。