带有几个变量的 with-statement:有没有更易读的方法来写这个?



例如,我需要使用一个with语句打开两个文件。 他们每个人都有一个条件:实际打开或使用某些东西。

就我而言,它是打开由名称指定的文件还是使用stdin/stdout(如果未指定名称)。问题是它对于单行来说太长太复杂了。

with    open(src_name, 'r') if src_name else sys.stdin as src, open(dst_name, 'w') if dst_name else sys.stdout as dst:
# do something
pass

我第一次有这样的东西:

with    open(src_name, 'r') if src_name else sys.stdin as src, 
open(dst_name, 'w') if dst_name else sys.stdout as dst:
# do something
pass

我个人喜欢这个版本。对我来说,它看起来很简单,但我需要使用空格来对齐两条线(我的 IDE PyCharm 警告我有多余的空格)。顺便说一句,在 python 中使用空格来对齐代码真的很重要吗?

另一种对齐方式是:

with open(src_name, 'r') if src_name else sys.stdin as src, 
open(dst_name, 'w') if dst_name else sys.stdout as dst:
# do something
pass

但由于 PEP 8 – 缩进,情况似乎更糟。

而且我不喜欢"正确"的版本,该版本可读性较差,乍一看甚至令人困惑:

with open(src_name, 'r') if src_name else sys.stdin as src, 
open(dst_name, 'w') if dst_name else sys.stdout as dst:
# do something
pass

我可以把它嵌套在两层,但根据禅宗的说法,它很糟糕。

所以我很感兴趣,是否有一种更优雅的方式来写这个? 或者也许我的版本很好,我应该忽略关于空格的警告。

引用《清洁代码》的作者、著名工程师鲍勃叔叔的话,"永远不要让代码的读者侧身滚动","你的代码应该读起来像写得很好的散文"。

与其将 if 语句放在 with 块中,不如将它们分开。

if src_name:
with open(src_name, 'r') as f:
pass #do something
else:
pass # do something else

此外,请考虑为变量使用更好的名称,即src_name使用更有意义的file_path>。

我强烈推荐罗伯特·C·马丁(Robert C. Martin)的《清洁代码》(Clean Code),它改变了我的生活。

最新更新