0

我刚刚用 Python 编写了一个实用程序来做我需要的事情(无关紧要,但它是为内部 DSL 生成与 ctags 兼容的标记文件)。

无论如何-我在声明的上下文中打开并阅读文件with,我很好奇,人们倾向于如何处理该过程中的失败?

我的解决方案是

with open(filename, 'rt') as f:
    content = f.read()

matches = re.findall(REGEX, content)

if len(matches) > 0:
    # do more stuff...
    pass

我将匹配检查放在 with 语句之外,因为我喜欢关闭并完成文件。但是,如果content永远不会被构建,这将失败。

我的解决方案是在这段代码上方初始化content为空字符串,但我得到的感觉是我希望函数结束;异常被抛出函数或其他东西。

在这种情况下,我可以将函数的其余部分放入with块中,但这会扩大打开文件的范围。我可以在块content之前创建,with以便它在失败时存在。但是,我很好奇,人们还希望看到哪些其他解决方案(假设这个问题首先有意义)?

我想我会喜欢这样的东西:

with open(filename, 'rt') as f:
    content = f.read()
else:
    content = ''

matches = re.findall(REGEX, content)

如果这是普遍共识,我将接受我只需要处理它并为函数的其余部分保持打开文件的想法。:)

4

1 回答 1

1

我要做的就是如你所说:

content = ''
with open(filename, 'rt') as f:
    content = f.read()

matches = re.findall(REGEX, content)

因为对于空字符串,正则表达式和检查匹配的成本可以忽略不计。

但是,假设您不重复使用它,只要最终关闭文件,立即关闭文件并不那么重要。

于 2010-09-16T02:27:10.893 回答