【问题标题】:Python proper code formatting (PEP8)Python 正确的代码格式 (PEP8)
【发布时间】:2011-10-22 20:39:23
【问题描述】:

所以我刚刚在 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

这是一个缩进的块。

【问题讨论】:

  • 您使用什么工具来“检查”您的代码?皮林特?
  • pep8 textmate 包
  • choice__exact 应该是 choice_exact 如果您对 pep8 如此感兴趣。顺便说一句,我不太关心多行列表理解识别。让它可读。
  • @JBernardo 我怀疑 choice__exact 名称来自 Django API。
  • PEP 仅对行首和行尾的下划线赋予特殊含义。它对内部双下划线没有意见。

标签: python code-formatting pep8


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

【讨论】:

  • 对,我刚接触 python,所以我只是不知道是否有更好的方法来解决这些问题并想从 git go 编写高质量的代码。
  • 是的,单独的行对我来说似乎不是一个好主意。这个感觉不错。
【解决方案2】:

我也无法使用您上面显示的代码重现您的 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 questionthe 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]

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

【讨论】:

  • 他在结束 )] 之前显然有空格/换行符。这违反了他的工具中的规则。
【解决方案3】:

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

【讨论】:

  • 如果您只需要遍历新的questions 对象一次,请仅使用生成器表达式。我认为这根本不是生成器表达式的好用处。
  • 是的,上下文很重要。在正确的情况下,生成器会更好,因为您可以推迟很多方法调用,直到结果更有意义。
【解决方案4】:

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

] 上的 E202 表示在此之前它正在寻找一个空格。确保代码中没有它。尝试在提问后立即关闭]

【讨论】:

  • 前面有空格,因为它在代码块内。
  • 他的意思是它所在的行是缩进的。这实际上并不重要,因为换行符无论如何都是空白。
猜你喜欢
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 1970-01-01
  • 2022-10-14
  • 2020-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多