所以我刚刚在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
这是一个缩进的块。
答案 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]
但它确实是关于什么是最易读/可维护的,这取决于你自己的判断。