4

所以我刚刚了解了python中的“列表理解”。其中一些对于单行(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

4 回答 4

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 检查器。如果您真的很喜欢将括号和方括号放在不同的行中获得的额外空格,那么就这样做。它不会使它成为“糟糕的代码”,也不会降低可读性。

于 2011-08-09T01:40:23.013 回答
0

取决于工具,我猜。哪个工具给你 E202?我复制粘贴并尝试使用这个pep8工具,它没有给出任何错误。但我特别是在一个空格之后questions并得到了错误。

上面的 E202]说它在此之前找到了一个空格。确保代码中没有它。]尝试在问题后尽快关闭。

于 2011-08-09T01:40:06.293 回答
0

考虑使用生成器表达式编写语句。

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实例更改为另一种类型。

于 2011-08-09T01:59:15.167 回答
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 在文件的旧版本上被调用,问题可能会发生保存文件时离开。我们可能需要更多信息来进一步调试。

至于列表理解本身的格式,您可能想看看这个其他 SO question以及来自 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]

但这实际上是关于什么是最可读/最可维护的,这取决于您自己的判断。

于 2011-08-09T02:57:25.737 回答