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