Python正确的代码格式(PEP8)

时间:2011-08-09 01:32:07

标签: python code-formatting pep8

所以我刚刚在python中了解了"List Comprehensions"。其中一些对于单行来说太长了(PEP8),我试图找出最好的(最可读的)方法来打破这些。

我想出了这个

questions = [
    (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )
    for q in questions
]

但它仍然在]之前抱怨空格,具体的pep8错误是E202

这是一个缩进的块。

4 个答案:

答案 0 :(得分:1)

我可能会这样做:

questions = [(q, 
              q.vote_set.filter(choice__exact='Y'), 
              q.vote_set.filter(choice__exact='N'), 
              request.session.get(str(q.id)))
                  for q in questions]

请记住,PEP8旨在与您的最佳判断一起使用;在任何情况下都不打算完全遵循它们。当多个规则冲突时,它们的结构也不总是有意义。

可以故意偶尔违反规则;像这样的跳棋只是为了确保你不会打破它们意外

编辑:将我的评论移到我的答案中。

你的代码看起来有点太类似于类似Lisp的括号语言或类似C语言的大括号语言,因为你将括号和括号放在不同的行上。

在Python中,您只需使用缩进来显示您通常使用括号/括号/括号在另一种语言的单独行中显示的内容。如果您接受代码并进行更改,则与我的版本相同。

但实际上,不要过分担心PEP检查器。如果你真的喜欢将括号和括号放在不同的行上而得到的额外空格,那就去做吧。它不会使它成为“坏代码”,也不会降低可读性。

答案 1 :(得分:0)

取决于该工具,我想。哪个工具给你E202?我复制粘贴并尝试使用此pep8工具,它没有给出任何错误。但我特意,但在questions之后出现了一个空白并得到错误。

]上的E202表示在此之前发现了一个空格。确保代码中没有。在问题之后尽快关闭]

答案 2 :(得分:0)

考虑使用generator expression编写语句。

questions = ((q,
              q.vote_set.filter(choice__exact='Y'),
              q.vote_set.filter(choice__exact='N'),
              request.session.get(str(q.id)),) 
             for q in questions)

此外,并非它的“错误”,但总的来说,我不建议重新定义声明的变量,因为它可能会导致代码混淆。在这种情况下,您将questions实例更改为其他类型。

答案 3 :(得分:0)

我也无法使用您在上面显示的代码重现您的PEP8警告。也许你可以将你的确切代码放在pastebin中?

PEP8的示例测试用例(如果使用--show-pep8选项)如下:

Avoid extraneous whitespace in the following situations:

- Immediately inside parentheses, brackets or braces.

- Immediately before a comma, semicolon, or colon.

Okay: spam(ham[1], {eggs: 2})
E201: spam( ham[1], {eggs: 2})
E201: spam(ham[ 1], {eggs: 2})
E201: spam(ham[1], { eggs: 2})
E202: spam(ham[1], {eggs: 2} )
E202: spam(ham[1 ], {eggs: 2})
E202: spam(ham[1], {eggs: 2 })

E203: if x == 4: print x, y; x, y = y , x
E203: if x == 4: print x, y ; x, y = y, x
E203: if x == 4 : print x, y; x, y = y, x

另外,我实际上并没有使用过Textmate,但是如果你正在进行类似于emacs的flymake模式的动态检查,那么也可能是pep8被调用旧版本的文件,并且保存文件时问题可能会消失。我们可能需要更多信息才能进一步调试。

至于列表推导本身的格式,您可能需要查看this other SO question以及the take from the Google style guide。我个人对你的方式没有任何问题。我想你也可以做像

这样的事情
def _question_tuple(q):
    return (
        q,
        q.vote_set.filter(choice__exact='Y'),
        q.vote_set.filter(choice__exact='N'),
        request.session.get(str(q.id))
    )

question_tups = [_question_tuple(q) for q in questions]

但它确实是关于什么是最易读/可维护的,这取决于你自己的判断。