在python中是否可以使用/ as语句?

时间:2012-08-28 22:07:47

标签: python file-io with-statement

而不是:

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。

是否有一种合理的方式将其转换为/作为形式?或者我只是想以错误的方式解决可选文件问题?

5 个答案:

答案 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