例如,我需要使用一个with
语句打开两个文件。
并且每个人都有条件:实际打开或使用某些东西。
在我的情况下,是否打开由name指定的文件或者如果未指定name则使用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 – indentation,它似乎更糟糕。
我不喜欢"正确"这个版本的可读性较差,乍一看甚至令人困惑:
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
我可以将它嵌套在两个级别,但根据zen它是不好的。
所以我感兴趣的是,如果有更优雅的方式来写这个吗? 或者也许我的版本很好,我应该忽略关于空格的警告。
答案 0 :(得分:1)
引用伟大的叔叔鲍勃,“清洁代码”的作者和着名的工程师,“永远不要让你的代码的读者向侧面滚动”,并且“你的代码应该读起来像写得好的散文”。
不是将if语句放在with块中,为什么不将它们分开。
if src_name:
with open(src_name, 'r') as f:
pass #do something
else:
pass # do something else
另外,请考虑为您的变量使用更好的名称,即代替src_name
使用file_path
>更有意义。
我强烈推荐'Clean Code' by Robert C. Martin - 它改变了我的生活。