例如,我需要使用一个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),它改变了我的生活。