而不是:
FILE = open(f)
do_something(FILE)
FILE.close()
最好使用它:
with open(f) as FILE:
do_something(FILE)
如果我有这样的东西怎么办?
if f is not None:
FILE = open(f)
else:
FILE = None
do_something(FILE)
if FILE is not None:
FILE.close()
do_something还有一个“if FILE is None”子句,并且在这种情况下仍然有用 - 如果FILE为None,我不想要跳过do_something。
是否有一种合理的方式将其转换为/作为形式?或者我只是想以错误的方式解决可选文件问题?
答案 0 :(得分:14)
如果您只是这样写:
if f is not None:
with open(f) as FILE:
do_something(FILE)
else:
do_something(f)
(file
是内置的btw)
<强>更新强>
这是一种时髦的方式,可以使用可选的None进行动态上下文,不会崩溃:
from contextlib import contextmanager
none_context = contextmanager(lambda: iter([None]))()
# <contextlib.GeneratorContextManager at 0x1021a0110>
with (open(f) if f is not None else none_context) as FILE:
do_something(FILE)
它创建一个返回None值的上下文。 with
将生成FILE作为文件对象,或生成None类型。但是None类型将具有适当的__exit__
答案 1 :(得分:4)
这似乎解决了你所有的问题。
if file_name is not None:
with open(file_name) as fh:
do_something(fh)
else:
do_something(None)
答案 2 :(得分:2)
类似的东西:
if file: #it checks for None,false values no need of "if file is None"
with open(file) as FILE:
do_something(FILE)
else:
FILE=None
答案 3 :(得分:0)
虽然所有其他答案都非常好,而且更可取,请注意with
表达式可能是任何表达式,因此您可以这样做:
with (open(file) if file is not None else None) as FILE:
pass
请注意,如果评估了else
子句,则会产生None
,这会导致异常,因为NoneType
不支持将相应的操作用作上下文管理器。
答案 4 :(得分:0)
从Python 3.7开始,您还可以这样做
from contextlib import nullcontext
with (open(file) if file else nullcontext()) as FILE:
# Do something with `FILE`
pass
有关更多详细信息,请参见official documentation。