我经常在代码中看到这个:
with open(file_path) as f:
json_content = json.load(f)
而且经常这样:
json_content = json.load(open(file_path))
我想知道后者是反模式还是两个版本之间的区别是什么。
答案 0 :(得分:1)
当您使用上下文管理器时,它可以保证您的文件在块结束时自动关闭。 with
statement通过使用close
方法调用文件对象的__exit__()
属性来完成此操作。
如文件所述:
with语句保证如果
__enter__()
方法返回 如果没有错误,则始终会调用__exit__()
。
了解更多功能https://docs.python.org/3.5/reference/compound_stmts.html#with
答案 1 :(得分:1)
json.load(open(file_path))
依靠GC来关闭文件。这不是一个好主意:如果有人没有使用CPython,垃圾收集器可能没有使用引用计数(它会立即收集未引用的对象),例如一段时间后才收集垃圾。
由于文件句柄在关联对象被垃圾收集或显式关闭(.close()
或.__exit__()
来自上下文管理器)时关闭,因此文件将保持打开状态,直到GC启动。
使用with
可确保文件在块保留后立即关闭 - 即使该块内发生异常,因此对于任何实际应用程序应始终首选。
答案 2 :(得分:0)
除了其他答案之外,上下文管理器与try-finally子句非常相似。
此代码:
with open(file_path) as f:
json_content = json.load(f)
可以写成:
f = open(file_path)
try:
json_content = json.load(f)
finally:
f.close()
前者显然更可取。