PEP8的E128是什么:可视缩进下的连续行未正确缩进?

353

刚用Sublime Text(配备了Sublime Linter)打开一个文件,发现一个我从未见过的PEP8格式错误。以下是文本:

urlpatterns = patterns('',
    url(r'^$', listing, name='investment-listing'),
)

它标记了第二个参数,以url(...)开头的那行。

我正准备在ST2中禁用此检查,但在忽略它之前,我想知道自己做错了什么。谁知道呢,如果它似乎很重要,我甚至可能会改变我的方式 :)

2个回答

555

PEP-8建议,如果你在第一行放置了任何内容,你应该将行缩进到开放括号,因此它应该缩进到开放括号:

urlpatterns = patterns('',
                       url(r'^$', listing, name='investment-listing'))

或者在起始行不放置任何参数,然后缩进到统一的级别:

urlpatterns = patterns(
    '',
    url(r'^$', listing, name='investment-listing'),
)

urlpatterns = patterns(
    '', url(r'^$', listing, name='investment-listing'))

我建议阅读PEP-8,你可以快速浏览它,而且它相当易懂,不像一些更技术性的PEP。


5
有人知道 Django 为什么这样做吗?有充分的理由吗?看起来遵循 PeP-8 应该同样容易。 - theherk
7
这在我所看到的Django代码中是如此普遍(而且它们的文档中也到处都是),以至于它可以说是超越了PEP-8,毕竟它说:“许多项目有其自己的编码样式指南。在发生任何冲突时,这些特定于项目的指南优先适用于该项目”。 - Nick T
6
@TheHerk 可能的理由是patterns()的第一个参数是唯一的(用于指定其他所有内容的前缀),而所有其他参数都是基本相同的URL模式。 - Nick T
6
@NickT,你误读了PEP-8——PEP-8建议在使用现有规则的项目中遵循该规则,但在这种情况下,代码不是进入Django,而是进入使用Django的项目——没有必要遵循他们的惯例。该规则的目的是保持代码库内部的一致性。 - Gareth Latty
26
请注意,PEP8 还规定您应忽略 PEP8,如果这样做有意义的话,在这种情况下我认为这是合理的。对于您自己的项目,可以自由地持有不同的看法。无论如何,在 Django 1.8 中使用 patterns() 将很快被废弃,这将成为一个无关紧要的问题。详见:https://docs.djangoproject.com/en/dev/releases/1.8/#django-conf-urls-patterns - Tom Carrick
显示剩余8条评论

23

这同样适用于像这样的语句(由PyCharm自动格式化):

    return combine_sample_generators(sample_generators['train']), \
           combine_sample_generators(sample_generators['dev']), \
           combine_sample_generators(sample_generators['test'])

这将会产生相同的样式警告。为了摆脱它,我不得不对其进行重写:

    return \
        combine_sample_generators(sample_generators['train']), \
        combine_sample_generators(sample_generators['dev']), \
        combine_sample_generators(sample_generators['test'])

6
我更喜欢在这里使用圆括号而不是反斜杠,第一行为return (,然后每个可返回的项单独成行缩进,最后在与return相同的缩进级别上将闭合括号放在单独的一行。编辑:就像这样https://pastebin.com/fAe7558X - Markus Meskanen
2
@MarkusMeskanen 是的,我也是。我只是想指出,即使自动格式化也不能完全符合这个规范。 - Stefan Falk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接