如果在条件下缩进很长时间,你通常会做这样的事情(实际上,PyDev会这样缩进):
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
但是,这会将if语句启动的块放在与if条件的最后部分相同的缩进级别上,这使得我认为它非常难看/难以读取,因为您没有立即看到块的开始位置
我想到的其他一些风格:
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()
这比第一个例子更具可读性,但缩进不再是4的倍数,而且它看起来不对,因为第二行的缩进比第一行中条件的开头少。
所以,我的主要问题是:对于那些不需要过长行(即单行条件)的情况,是否有建议的缩进样式? 如果没有,你更喜欢这样的情况?
答案 0 :(得分:22)
我经常通过在自己的陈述中计算条件来解决这个问题:
condition = (collResv.repeatability is None or
collResv.somethingElse)
if condition:
collResv.rejected = True
collResv.rejectCompletely()
尽管如此,对于一个仍然相对较短的情况,如你的具体例子,我会选择 nosklo 的解决方案 - 这里使用的额外语句更适合更长的条件表达式。
答案 1 :(得分:13)
这就是我的所作所为:
if (collResv.repeatability is None or
collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
答案 2 :(得分:10)
此前所有建议的一个问题是后续条件的逻辑运算符放在前一行。 Imo,这使得它的可读性降低。
我建议将逻辑运算符放在与if语句附加的条件相同的行上。
在我看来,这是更好的
if (None == foo
and None == bar
or None == foo_bar):
比这个:
if (None == foo and
None == bar or
None == foo_bar):
答案 3 :(得分:9)
这是一个间接的答案 - 不直接回答风格问题,但这是一般的实际答案,所以值得一提。
我发现需要编写多行条件非常罕见。这有两个因素:
通过我最近的项目,大约12kloc,只有一个条件足够长,需要包装;这个问题很少出现。如果你确实需要这样做,那么就像nosklo所说的那样,单独缩进它 - 正如你所注意到的那样,将它缩进到与它下面的块相同的水平是令人困惑和难以阅读的。
答案 4 :(得分:3)
PEP-8在这里看起来实际上是矛盾的。虽然“最大行长度”下的示例显示了括号的使用和标准的4字符缩进,但“缩进”部分表示,就函数声明而言,“应使用进一步的缩进来清楚地将自己区分为连续行。 ”。我不明白为什么这只会被限制为“def”而不是“if”。
答案 5 :(得分:2)
我会这样做。保持它远远不会混淆。
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)
答案 6 :(得分:0)
Pep-8建议您缩进原始示例的方式。
现在如果你愿意面对那些神圣的风格指南飞行:-)你可以将操作员移到下一行:
if (collResv.repeatability is None
or collResv.somethingElse):
collResv.rejected = True
collResv.rejectCompletely()
我不是真的很喜欢这个,我实际上发现你的原始语法相当容易阅读,并且不会花太多时间用缩进或换行符。
答案 7 :(得分:0)
在这种情况下,我只会这样做:
if (collResv.repeatability is None or
collResv.somethingElse):
# do:
collResv.rejected = True
collResv.rejectCompletely()
答案 8 :(得分:-1)
我有时会使用的选项(虽然我的可读性并不完全出售):
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()