0

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

就我而言,是打开由名称指定的文件,还是在未指定名称的情况下使用标准输入/标准输出。问题是它对于单行来说太长太复杂了。

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

我可以将它嵌套在两个层次中,但根据 zen..

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

4

1 回答 1

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更有意义。

我强烈推荐Robert C. Martin 的“清洁代码” ——它改变了我的生活。

于 2018-01-21T09:32:43.727 回答