python - 将 with ... as 语句的结果分配给 self.bar

标签 python

在Python类中,一个方法打开了一个文件,但实际使用文件对象的是另一个方法。所以我写:

def first_method(self):
    with open(FILE) as f:
        self.output = f
        self.another_method()

def another_method(self):
    self.output.write(DATA)

如您所见,another_method 是由 first_methodwith ... as 范围内调用的,因此我确信another_method 将在 first_method 退出 with ... as 范围之前完成 - 它有效。但是,我对这一行感到困惑:

self.output = f

在另一个函数中使用 with ... as 语句的结果是一个好习惯吗?这会导致意外或无法控制的行为吗?

而且,another_method 并不是唯一使用 f 的地方。实际上,another_method 是一个协程,其中许多会异步写入 f。所以我必须在 another_method 之外打开该文件。

还有许多其他上下文管理器面临同样的问题,例如aiohttp.ClientSessiontqdm.tqdm。将它们作为参数传递会导致参数过多。

实际上,当我写this时,问题就出现了。 .

最佳答案

with 语句会导致在 block 末尾自动执行对象的 __exit__ 方法。可以合理地假设在 __exit__ 之后该对象处于不可用状态,即使您仍然拥有对它的引用。将其保存为对象属性是不明智的。

在您的具体示例中,您最好将文件作为参数显式传递给 another_method

关于python - 将 with ... as 语句的结果分配给 self.bar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46986856/

相关文章:

python - 有没有办法让用户定义的 Python 函数像内置语句一样运行?

Python依赖分析器库

python - Wing IDE 中的 Matlab 样式变量编辑器

python - 将不同日期格式的txt导入MySQL

python - 将默认空列表/dict/set/etc 指定为函数 arg 的正确方法

Python-写入MySQL

python - MoviePy 无法正确显示非英文文本

python - 如何将 subprocess.run 的输出保存到字符串中?

python - 如何将鼠标单击事件发送到 mac osx 中的窗口

python - Pandas:两个数据框的组合