Python的常见编码风格?

Posted

技术标签:

【中文标题】Python的常见编码风格?【英文标题】:Common coding style for Python? 【发布时间】:2011-02-18 09:44:55 【问题描述】:

我对 Python 还是很陌生,我想开发我的第一个严肃的开源项目。我想问一下python项目常见的编码风格是什么。我也会把我现在正在做的事情。

1.- 最广泛使用的列宽是多少? (永恒的问题) 我目前坚持使用 80 列(这很痛苦!)

2.- 使用什么引号? (我已经看到了所有内容,PEP 8 没有提及任何明确的内容) 除了使用三重双引号的文档字符串,我对所有内容都使用单引号。

3.- 我将进口商品放在哪里? 我按这个顺序把它们放在文件头。

import sys
import -rest of python modules needed-

import whatever
import -rest of application modules-

<code here>

4.- 我可以使用“import whatever.function as blah”吗? 我看到了一些无视这样做的文件。

5.- 用于缩进的制表符或空格? 当前使用 4 个空格制表符。

6.- 变量命名方式? 除了类,我使用小写字母,我把它放在 camelCase 中。

有什么推荐的吗?

【问题讨论】:

如果您已经看过 PEP 8,那么可能没有多少其他东西被广泛接受为标准...... @David:谢谢,我会跟进 PEP 8。 @Fuzzy lollipop:为什么? 这是一个引用“没有什么比一个看起来像一系列空格但实际上不是的字符更糟糕的了,它看起来像不同数量的空格,具体取决于您的显示设置,而且您甚至可能不会无需重新配置编辑器即可打字!上次我检查时,任何编辑器都允许您键入空格。”这几乎概括了它。 @Oscar Carballal:无论太空***者怎么说,制表符都不是邪恶的(除非与空格混合,基本上每个人都认为这是邪恶的)。喜欢标签有完全合法、合理的理由。但是,如果您打算与其他人合作(如果您谈论的是开源项目,实际上是给定的),您将需要切换到使用所有空间,就像实用主义一样。 我使用标签已经很多年了;不,他们不是邪恶的。然而,在混合制表符和空格时引发错误的 Python 3 更改是非常邪恶的:这意味着您必须更改编辑器的配置来编辑不同的代码库,这对学术和实践都没有好处。 【参考方案1】:

1.- 现在大多数人都有 16:9 或 16:10 的显示器。即使他们没有宽屏幕,他们也有很多像素,80 列也不是什么大问题,就像每个人都在 4:3 显示器上的远程终端窗口中的命令行黑客攻击320 X 240。我通常在行太长时结束,这是主观的。我在 23" 显示器 X 2 上的分辨率为 2048 X 1152。

2.- 默认情况下单引号,因此您不必转义双引号,当您需要嵌入单引号时使用双引号,以及用于嵌入换行符的字符串的三引号。

3.- 将它们放在文件的顶部,如果模块全局不需要它们,有时将它们放在 ma​​in 函数中。

4.- 重命名某些模块是一种常见的习惯用法。一个很好的例子如下。

try:
    # for Python 2.6.x
    import json
except ImportError:
    # for previous Pythons
    try:
        import simplejson as json
    except ImportError:
        sys.exit('easy_install simplejson')

但仅导入类或函数的首选方法是 from module import xxx,如果需要,还可以使用可选的 as yyy

5.- 始终使用空格! 2或4,只要没有TABS

6.- 类应该是 UpperCaseCamelStyle,变量是小写,有时是 lowerCamelCase,有时是 all_lowecase_separated_by_underscores,函数名也是如此。 “常量”应该是 ALL_UPPER_CASE_SEPARATED_BY_UNDERSCORES

如有疑问,请参阅 Python 源代码PEP 8,代码库中的现有约定。但最重要的是尽可能内部一致所有 Python 代码都应该尽可能地看起来像是由同一个人编写的。

【讨论】:

80 列可让您在手机/手持设备上进行编码,并且当我需要通过终端处理某些事情时(即:X 服务器崩溃),这要容易得多,因为 80 列总是适合其中。此外,我所有的屏幕都可以并排放置两个 80 列的窗口,而且我通常会同时打开 4 个以上的源以进行交叉引用。如果你把事情弄得太垂直,那就更难理解了……我想这并不重要,因为你可以使用自动格式化程序…… +1 表示关于 80 列换行的罕见常识。 PEP8 建议以 80 列换行,即使在编写时也已过时,除了修改代码外什么也不做。包装到 120 列左右。如果有人真的还在 80x25 中编辑代码,他们就会活下来。 -1 用于 80 列环绕评论。这不是它是否过时的问题,而是最有效地利用屏幕空间的问题,因为屏幕仍然是水平长的。这使得 80 个字符很容易在我的典型屏幕上对齐 4 列代码。在这种环境下,很难看到没有保留在 80 列的代码。至于说它难以跟上的原始评论:不用担心它会更容易,然后在您准备好维护它时在其上运行类似 autopep8 的脚本。【参考方案2】:

由于我对“样式”非常着迷,所以我将写下我目前在近 8k SLOC 项目中使用的指南,该项目有大约 35 个文件,其中大部分与 PEP8 匹配。

    PEP8 说 79(WTF?),我选择 80,我现在已经习惯了。毕竟眼球运动少!

    在 ''' 中跨越多行的文档字符串和内容。 '' 中的所有其他内容。另外我不喜欢双引号,我一直只使用单引号......我猜那是因为我来自 javascript 角落,在那里使用 '' 更容易,因为这样你就不必全部转义html的东西:O

    在头部,内置在自定义应用程序代码之前。但我也采用“提前失败”的方法,所以如果有一些依赖于版本的东西(例如 GTK),我会先导入它。

    取决于,大多数时候我使用 import foo 和 from foo import,但在某些情况下(例如,名称已由另一个导入定义)我也使用 from foo import bar 作为 bla。 /p>

    4 个空格。时期。如果您真的想使用制表符,请确保在使用 SCM 时在提交之前将它们转换为空格。但永远不要(!)混合标签和空格!它可以并且将会引入可怕的错误。

    some_method 或 foo_function,一个 CONSTANT,MyClass。

您还可以在方法调用或某些内容跨越多行的情况下争论缩进,并且您可以争论将使用哪种行继续样式。要么用() 包围所有内容,要么在行尾使用\。我做后者,我还将运算符和其他东西放在下一行的开头。

# always insert a newline after a wrapped one
from bla import foo, test, goo, \
                another_thing

def some_method_thats_too_long_for_80_columns(foo_argument, bar_argument, bla_argument,
                                              baz_argument):

    do_something(test, bla, baz)

    value = 123 * foo + ten \
            - bla

    if test > 20 \
       and x < 4:

        test_something()

    elif foo > 7 \
         and bla == 2 \
         or me == blaaaaaa:

        test_the_megamoth()

我还有一些比较操作的指导方针,我总是使用is(not) 来检查None True False,而且我从不进行像if foo: 这样的隐式布尔比较,我总是使用if foo is True:,动态类型很好,但在在某些情况下,我只是想确保事情做对了!

我做的另一件事是永远不要使用空字符串!它们在常量文件中,在其余代码中我有 username == UNSET_USERNAMElabel = UNSET_LABEL 之类的东西,这样更具描述性!

我也有一些严格的空白准则和其他疯狂的东西,但我喜欢它(因为我对此很着迷),我什至写了一个脚本来检查我的代码:http://github.com/BonsaiDen/Atarashii/blob/master/checkstyle

警告(!):它会伤害你的感情!甚至比 JSLint 还多...

但这只是我的 2 美分。

【讨论】:

我的 2048X1152 显示器在 12 点的 180 列中为差异标记留出了足够的空间!【参考方案3】:

PEP 8 几乎是所有常见样式指南的“根”。

Google 的 Python style guide 有一些部分是经过深思熟虑的,但其他部分是特殊的(两个空格缩进而不是流行的四个空格缩进,以及函数和方法的 CamelCase 样式而不是 camel_case 样式,是相当主要的特质)。

关于您的具体问题:

1.- 最广泛使用的列宽是多少? (永恒的问题) 我目前坚持 80 列 (而且很痛苦!)

80 列最受欢迎

2.- 使用什么引号? (我已经看到了一切,PEP 8 没有提到 什么都清楚)我正在使用单 除了文档字符串之外的所有内容的引号, 使用三重双引号。

我更喜欢你使用的风格,但即使是谷歌也无法就此达成共识:-(

3.- 我在哪里放置我的进口商品?我将它们放在文件头中 顺序。

import sys import -其余的python 需要的模块-

导入任何导入 -rest of 应用模块-

是的,很好的选择,也很受欢迎。

4.- 我可以使用“importwhat.function as blah”吗?我看到了一些 无视这样做的文档。

我强烈建议您始终导入模块——而不是从模块内部导入特定名称。这不仅仅是风格 - 还有强大的优势,例如这样做的可测试性。 as 子句很好,可以缩短模块名称或避免冲突。

5.- 用于缩进的制表符或空格?当前使用 4 个空格制表符。

最受欢迎。

6.- 变量命名方式?除了类,我对所有东西都使用小写, 我把它放在camelCase中。

几乎每个人都用大写首字母命名类,用全大写命名常量。

【讨论】:

谢谢!我会听从你关于导入模块而不是函数的建议:) 在这里更新,谷歌的风格指南已经消除了提到的两个特质,现在符合 PEP 8 1) 4 个缩进空格:google.github.io/styleguide/pyguide.html#Indentation,以及 2) 函数和方法的下划线:@ 987654324@

以上是关于Python的常见编码风格?的主要内容,如果未能解决你的问题,请参考以下文章

(转)PEP 8——Python编码风格指南

editorconfig 最常见的用途,即为统一文件的编码字符集以及缩进风格

Python编码风格

python基础之类的编码风格

Python的编码风格

python 小插曲:编码风格