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

wer*_*ika 13 python file-io with-statement

而不是这个:

FILE = open(f)
do_something(FILE)
FILE.close()
Run Code Online (Sandbox Code Playgroud)

最好使用它:

with open(f) as FILE:
    do_something(FILE)
Run Code Online (Sandbox Code Playgroud)

如果我有这样的东西怎么办?

if f is not None:
   FILE = open(f)
else:
   FILE = None
do_something(FILE)
if FILE is not None:
    FILE.close()
Run Code Online (Sandbox Code Playgroud)

当do_something也有一个"如果文件是无"的条款,而且还做一些有用的事情在这种情况下-我希望只是跳过do_something如果FILE是无.

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

jdi*_*jdi 16

如果你只是这样写:

if f is not None:
    with open(f) as FILE:
        do_something(FILE)
else:
    do_something(f)
Run Code Online (Sandbox Code Playgroud)

(file是一个内置的顺便说一句)

更新

下面是一个时髦的方法,可以使用一个不会崩溃的可选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)
Run Code Online (Sandbox Code Playgroud)

它创建一个返回None值的上下文.的with意愿或者农产品文件作为文件的对象,或无类型.但是无类型将有适当的__exit__

  • 此外,如果引发异常,它也会失败(`AttributeError:'listiterator'对象没有属性'throw'`).这更健壮:`def none_context(a = None):返回contextmanager(lambda:(x代表[a]中的x))()` (2认同)

mad*_*n25 13

从 Python 3.7 开始,你也可以这样做

from contextlib import nullcontext

with (open(file) if file else nullcontext()) as FILE:
    # Do something with `FILE`
    pass
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅官方文档