使用单个with语句

我想基于布尔标志使用with语句打开多个文件(这样我可以获得上下文管理器的好处),布尔标志指示我的程序是否应该实际打开每个文件。

我知道我可以使用with语句打开多个文件,例如:

with open('log.txt','w') as logfile,open('out_a.txt','w') as out_a,open('out_b.txt','w') as out_b:
    # do something with logfile,out_a and out_b
# all files are closed here

我想运行类似的语句,但仅根据某些文件的相应标志打开它们。我考虑过将其实现为conditional_open函数,例如:

write_log = True
write_out_a = False
write_out_b = True

with conditional_open('log.txt','w',cond=write_log) as logfile,cond=write_out_a) as out_a,cond=write_out_b) as out_b:
    # do something with logfile,out_a and out_b
# all files are closed here

但是我对如何正确创建该功能有些困惑。理想情况下,coditional_open要么返回打开的文件句柄,要么返回None(在这种情况下,永远不会创建/触摸/删除文件):

def conditional_open(filename,mode,cond):
    return open(filename,mode) if cond else None

但是我担心这会在打开文件时跳过上下文管理器的好处,因为我正在从文件外部调用open。这个假设正确吗?

任何人都可以提出一些有关如何做到这一点的想法吗?我知道我可以根据条件创建模拟文件对象并改为写入它们,但这对我来说有点令人费解-这似乎是一个简单的问题,应该在Python中应该有一个简单的解决方案

wqf163 回答:使用单个with语句

只需将您的功能设置为上下文管理器即可。

from contextlib import contextmanager

@contextmanager
def conditional_open(f_name,mode,cond):
    if not cond:
        yield None
    resource = open(f_name,mode)
    try:
        yield resource
    finally:
        resource.close()
本文链接:https://www.f2er.com/3064261.html

大家都在问