Python 代码规范格式化(PEP8)

4 投票
4 回答
3775 浏览
提问于 2025-04-16 23:10

我刚刚学会了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 个回答

0

这要看你使用的工具是什么了。我猜是哪个工具给你提示了E202?我复制粘贴了一下,试了这个pep8工具,结果没有报错。不过我特意在questions后面加了一个空格,结果就报错了。

关于]的E202提示,是说它在这个符号前面发现了一个空格。确保你的代码里没有这个空格。试着在questions后面尽快关闭]

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这个实例改成了另一种类型。

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检查器。如果你喜欢把括号和方括号放在单独一行带来的额外空白,那就继续这样做吧。这并不会让你的代码变得“糟糕”,也不会降低可读性。

撰写回答