取而代之的是:
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也有一个“如果文件是无”的条款,而且还做一些有用的事情在这种情况下-我不希望只是跳过do_something如果FILE是无。
有没有这个与转换成/为形式的一个明智的办法? 或者,我只是想解决一个错误的方式可选文件的问题?
如果你只写它是这样的:
if f is not None:
with open(f) as FILE:
do_something(FILE)
else:
do_something(f)
( file
是一个内置的BTW)
更新
这是一个时髦的方式做一个可选的无不会崩溃的在即时情境:
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)
它创建一个返回值无上下文。 在with
将或者产生文件作为文件的对象,或无类型。 但无类型将有一个适当的__exit__
这似乎解决你所有的顾虑。
if file_name is not None:
with open(file_name) as fh:
do_something(fh)
else:
do_something(None)
就像是:
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
而所有其他的答案是优秀的,并且最好,注意with
表达可以是任何的表情,这样你就可以这样做:
with (open(file) if file is not None else None) as FILE:
pass
需要注意的是,如果else
条款进行了评估,以获得None
,这将导致一个例外,因为NoneType
不支持相应的操作被用作上下文管理器。
因为Python 3.7,你也可以做
from contextlib import nullcontext
with (open(file) if file else nullcontext()) as FILE:
# Do something with `FILE`
pass
请参阅官方文档了解更多详情。