带有多个变量的 with 语句:是否有更易读的方式来编写它?

With-statement with several variables: is there a more readable way to write this?

例如,我需要使用一个 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 – indentation,情况似乎更糟。

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

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 来说它很糟糕..

所以我很想知道是否有更优雅的写法? 或者也许我的版本很好,我应该忽略关于空格的警告。

引用鲍勃叔叔的话,他是 'Clean Code' 的作者和著名工程师,'never let the readers of your code scroll sideways' 和 'your code should read like well written prose'。

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

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

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

我强烈推荐 'Clean Code' by Robert C. Martin - 它改变了我的生活。