是否有可能有一个可选的/在蟒蛇声明?(Is it possible to have an optio

2019-07-31 05:23发布

取而代之的是:

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是无。

有没有这个与转换成/为形式的一个明智的办法? 或者,我只是想解决一个错误的方式可选文件的问题?

Answer 1:

如果你只写它是这样的:

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__



Answer 2:

这似乎解决你所有的顾虑。

if file_name is not None:
    with open(file_name) as fh:
        do_something(fh)
else:
        do_something(None)


Answer 3:

就像是:

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


Answer 4:

而所有其他的答案是优秀的,并且最好,注意with表达可以是任何的表情,这样你就可以这样做:

with (open(file) if file is not None else None) as FILE:
    pass

需要注意的是,如果else条款进行了评估,以获得None ,这将导致一个例外,因为NoneType不支持相应的操作被用作上下文管理器。



Answer 5:

因为Python 3.7,你也可以做

from contextlib import nullcontext

with (open(file) if file else nullcontext()) as FILE:
    # Do something with `FILE`
    pass

请参阅官方文档了解更多详情。



文章来源: Is it possible to have an optional with/as statement in python?