用于多行删除的代码风格' if'声明? [重复]

    这个问题在这里已有答案:                           在'如果'中设置多线条件的样式声明?                                      30个答案                                    
已邀请:
这是一个间接的答案 - 不直接回答风格问题,但这是一般的实际答案,所以值得一提。 我发现需要编写多行条件非常罕见。这有两个因素: 不要将代码包装在80列。 PEP-8关于这个问题的建议是古老而有害的;我们已经过了80x25终端和编辑器的时代,这些终端和编辑器无法合理地处理包装。 100列很好,120也是可以接受的。 如果条件变得太长以至于它们仍然需要换行,那么将一些逻辑移出条件并进入单独的表达式通常是合理的。这也有助于提高可读性。 通过我最近的项目,大约12kloc,只有一个条件足够长,需要包装;这个问题很少出现。如果你确实需要这样做,那么就像nosklo所说的那样,单独缩进它 - 正如你所注意到的那样,将它缩进到与它下面的块相同的水平是令人困惑和难以阅读的。     
我经常通过计算自己语句中的条件来解决这个问题:
condition = (collResv.repeatability is None or
             collResv.somethingElse)
if condition:
    collResv.rejected = True
    collResv.rejectCompletely()
虽然,对于仍然相对较短的情况,如在您的具体示例中,我会选择nosklo的解决方案 - 此处使用的额外语句更适合更长的条件表达式。     
这就是我做的:
if (collResv.repeatability is None or
        collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
    
这里所有先前建议的一个问题是后续条件的逻辑运算符被放在前一行。 Imo,这使得它的可读性降低。 我建议将逻辑运算符放在与if语句附加的条件相同的行上。 在我看来,这更好
if (None == foo
        and None == bar
        or None == foo_bar):
比这个:
if (None == foo and
        None == bar or
        None == foo_bar):
    
PEP-8在这里看起来实际上是矛盾的。虽然“最大行长度”下的示例显示了括号的使用和标准的4字符缩进,但“缩进”部分表示,就函数声明而言,“应使用进一步的缩进来清楚地将自己区分为连续行。 ”。我不明白为什么这只会被限制为“def”而不是“if”。     
我会这样做的。保持它缩进远,不要混淆。
if (collResv.repeatability is None or
                          collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
PEP-8建议就在这里。 http://www.python.org/dev/peps/pep-0008/#indentation 建议下面的代码
# Aligned with opening delimiter
foo = long_function_name(var_one, var_two,
                         var_three, var_four)

# More indentation included to distinguish this from the rest.
def long_function_name(
        var_one, var_two, var_three,
        var_four):
    print(var_one)
不建议使用以下代码
# Arguments on first line forbidden when not using vertical alignment
foo = long_function_name(var_one, var_two,
    var_three, var_four)

# Further indentation required as indentation is not distinguishable
def long_function_name(
    var_one, var_two, var_three,
    var_four):
    print(var_one)
    
Pep-8建议您缩进原始示例的方式。 现在如果你愿意面对那些神圣的风格指南飞行:-)你可以将操作员移到下一行:
if (collResv.repeatability is None
    or collResv.somethingElse):
    collResv.rejected = True
    collResv.rejectCompletely()
我不是真的很喜欢这个,我实际上发现你的原始语法相当容易阅读,并且不会花太多时间用缩进或换行来修改。     
在这种情况下,我会这样做:
if (collResv.repeatability is None or
    collResv.somethingElse):
    # do:
    collResv.rejected = True
    collResv.rejectCompletely()
    
我有时会使用的一个选项(尽管我的可读性并不完全出售):
if (collResv.repeatability is None or
    collResv.somethingElse
):
    collResv.rejected = True
    collResv.rejectCompletely()
可能这样会更具可读性:
if (
collResv.repeatability is None or
collResv.somethingElse
):
    collResv.rejected = True
    collResv.rejectCompletely()
    

要回复问题请先登录注册