微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“with”语句中的交互模式

如何解决“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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?