缩进包装的括号if条件时的样式

时间:2014-06-01 17:40:10

标签: python coding-style

说我有功能

def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"

我对if (长4个字符的事实做了什么,从而使“返回”位看起来很奇怪(并且可能具有误导性)?请不要说if内容放在1行,在我的实际代码中,内容超过79个字符。

我想到了几个选择:

A)

def func(arg1):
    if (arg1 > 5
        and arg1 != 10
        ):
        return "something"

B)

def func(arg1):
    if (
        arg1 > 5
        and arg1 != 10
    ):
        return "something"

偏离主题,但是孤儿):看起来像一张不高兴的脸:(

3 个答案:

答案 0 :(得分:4)

PEP 8 recommends a double-indent in similar cases,我觉得它很好看:

def func(arg1):
    if (arg1 > 5
            and arg1 != 10):
        return "something"

  

这个PEP明确地没有说明在多行if陈述之后如何或是否进一步在视觉上区分连续线。

所以你可以根据它真正使用任何可接受的选项:

# No extra indentation.
if (this
    and that):
    do_something()

# Add a comment, which will provide some distinction in editors
# supporting syntax highlighting.
if (this
    and that):
    # Since both conditions are true, we can frobnicate.
    do_something()


# Add some extra indentation on the conditional continuation line.
if (this
        and that):
    do_something()

答案 1 :(得分:1)

PEP8 涵盖了此内容。这样:

def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"
假设每个部分都低于80个字符,

的格式应如下所示:

def func(arg1):
    if arg1 > 5 and arg1 != 10:
        return "something"

或者像这样,将控制流程代码块与continuation区分开来:

def func(arg1):
    if (
      really.really.really.really.really.really.really.long.name(arg1) > 5
      and arg1 != 10):
        return "something"

虽然沿着括号对齐通常很好,但我会断言以下是,因为它无法在视觉上区分代码块和括号对齐的条件:

def func(arg1):
    if (really.really.really.really.really.really.really.long.name(arg1) > 5 
        and arg1 != 10): # Don't do this!
        return "something"

答案 2 :(得分:0)

我知道,这有点痛苦。在许多人看来,PEP8并没有完全涵盖这一点。我使用Flake8检查我的Python代码,这种特殊情况是一个真正的视觉代码杀手。

如果您没有使用自动样式检查程序,我会坚持使用您的第一个示例:

def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"

您知道,这违反了E125 (continuation line with same indent as next logical line)。如果您尝试修复它,您可能会遇到E127 (continuation line over-indented for visual indent)。这是一个粘性循环;)

你可以做的一件事傻瓜样式检查器是创建1个字符的偏移量,并为条件代码块添加另一个缩进级别。这看起来很愚蠢,但它将解决所有PEP8问题。

def func(arg1):
if ((arg1 > 5
     and arg1 != 10)):
        return "something"

不可否认,大多数情况下,出于您的确切原因,我将这些行留下超过80个字符(和E125)。你也可以重构你的条件,但我不确定它是否值得付出额外的努力。