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

Python 缩进包装的、带括号的if条件时的样式,python,coding-style,Python,Coding Style,假设我有这个功能 def func(arg1): if (arg1 > 5 and arg1 != 10): return "something" 对于if(为4个字符长,因此“return”位看起来很奇怪(可能会产生误导),我该怎么办?请不要说将if内容放在一行,在我的实际代码中,内容超过79个字符 我想到了几个选择: (A) (B) 离题了,但是孤儿的:看起来像一张不高兴的脸:(,我觉得它看起来很好: def func(arg1): i

假设我有这个功能

def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"
对于
if(
为4个字符长,因此“return”位看起来很奇怪(可能会产生误导),我该怎么办?请不要说将
if
内容放在一行,在我的实际代码中,内容超过79个字符

我想到了几个选择:

(A)

(B)

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

,我觉得它看起来很好:

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

对于如何或是否在多行
if
语句之后进一步直观地区分连续行,本PEP没有明确的立场

因此,您可以根据it实际使用任何可接受的选项:


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

如果您不使用自动样式检查器,我将继续使用您的第一个示例:

正如你所知,这违反了。如果你试图修复它,你很可能会遇到。这是一个粘性循环;)

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

def func(arg1):
if ((arg1 > 5
     and arg1 != 10)):
        return "something"
不可否认,出于您的确切原因(和E125),大多数时候我会将这些行的长度超过80个字符。您也可以重构您的条件,但我不确定是否值得付出额外的努力。

PEP8确实涵盖了这一点。这:

def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"
假设每个部分少于80个字符,格式应如下所示:

def func(arg1):
    if 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):
        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"

啊,当我上次读它的时候,我一定错过了。PEP8建议将连续行的缩进与以下缩进行区分开来。在你所引用的例子和之前的否定例子中,它有点自相矛盾(“因为压痕不可区分,所以需要进一步的压痕)。@moooeeep这可能就是为什么我错过了额外的压痕的原因,因为矛盾而恼火没有回答你的问题,但是如果你的代码中有80个字符,如果条件,那么你可以考虑把它的一部分提取成几个局部变量,或者用布尔函数调用替换。不是为了避免解决压痕问题,但是为了提高可读性。我强烈推荐选项B。这是唯一一个明确说明
if
条件中的缩进是独立的,并且在语义上与
if
正文的缩进没有联系的选项。@BrenBarn似乎每个人都有自己喜欢的风格:S@RomanI有用的提示,但我认为在我实际代码中的特定情况下,可读性会降低(相应的arg1和arg5基本上都有较长的变量名)。实际上,循环语句和函数遵循相同的样式指南吗?
def func(arg1):
    if (arg1 > 5
        and arg1 != 10):
        return "something"
def func(arg1):
    if 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):
        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"