可以有条件地使用"with"语句吗?

Hen*_*rik 12 python contextmanager

我有一个大致如下结构的Python函数,它计算一些结果并将它们写入文件:

results = []
with open(filename, "w") as output:
    for item in items:
        result = compute_stuff(item)
        write_result(item, result, output)
        results.append(result)
return results
Run Code Online (Sandbox Code Playgroud)

现在我并不总是想将结果写入文件 - 有时我只想计算它们并让它们返回.使"write_result"成为条件很容易,但是还有一种方法可以使"with"语句中的文件创建与条件相关吗?(我知道我可以明确地处理文件的打开和关闭,但是我会产生"try/finally"开销,创建"with"语句以避免.)

有一个优雅的解决方案吗?

编辑添加: 我可能过于简化了示例.我没有写任意文件,而是使用matplotlib.backends.backend_pdf.PdfPages(链接),并在每一步中添加一个图(PDF中的新页面).特别是,这意味着我无法重新打开PDF文件PdfPages,因为它会被覆盖.

glg*_*lgl 9

您可以编写自己的上下文管理器功能:

class Dummysink(object):
    def write(self, data):
        pass # ignore the data
    def __enter__(self): return self
    def __exit__(*x): pass

def datasink(filename):
    if filename:
        return open(filename, "w")
    else:
        return Dummysink()

...

results = []
with datasink(filename) as output:
    for item in items:
        result = compute_stuff(item)
        write_result(item, result, output)
        results.append(result)
return results
Run Code Online (Sandbox Code Playgroud)