当我泡菜时,有人可以解释 'with open()' 的每个组件在做什么吗?

Can someone give an ELI5 explanation of what each component of 'with open()' is doing when I pickle?

我已经多次使用这种语法来 pickle 一个文件,但事实是我不明白实际发生了什么。我只知道它给了我想要的结果。

with open('some_model_name.pickle', 'wb') as to_write:
   pickle.dump(some_model_object, to_write)

但实际上发生了什么?如果我不指定 wb 怎么办?什么是 as to_write

与我读回我的模型时相同:

with open(path+'some_model_name.pickle', 'rb') as to_read:
  some_model_object = pickle.load(to_read)

“wb”是 shorthand 表示“以二进制模式写入”。如果您不指定“wb”,您将获得 open 的默认模式,该模式以文本模式读取。在这种情况下,对 pickle.dump 的调用将失败,因为文件是在 read-only 模式下打开的,并且您尝试写入一些字节。

绑定as to_write意味着将open调用的return-value分配给一个名为to_write的局部变量。在不使用上下文管理器(“with 语句”)的情况下做同样事情的类似方法可能如下所示:

try:
    to_write = open('some_model_name.pickle', 'wb')
    pickle.dump(some_model_object, to_write)
finally:
    to_write.close()

这是一个简化版本,在此答案末尾的文档 link 中给出了更完整的等效版本。

问题中显示的第二个 code-block 类似,只是它以“读取二进制”模式“rb”打开文件“some_model_name.pickle”,这是合适的,因为 pickle.load这里使用(读字节)代替pickle.dump(写字节)。

我描述的部分的相关文档link: