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

时间:2018-01-21 09:23:31

标签: python with-statement zen-of-python

例如,我需要使用一个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它是不好的。

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

1 个答案:

答案 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 - 它改变了我的生活。