11

我对 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.- 我可以使用“importwhat.function as blah”吗?
我看到一些无视这样做的文件。

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

6.- 变量命名方式?我将小写字母用于除类之外的所有内容,我将其放入 camelCase 中。

你有什么推荐的吗?

4

3 回答 3

19

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

Google 的Python 样式指南有一些经过深思熟虑的部分,但其他部分是特殊的(两个空格缩进而不是流行的四个空格缩进,以及函数和方法的 CamelCase 样式而不是 camel_case 样式,非常重要异能)。

关于您的具体问题:

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

80列最受欢迎

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

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

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

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

导入任何导入-其余应用程序模块-

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

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

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

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

压倒性地最受欢迎。

6.- 变量命名方式?我将小写字母用于除类之外的所有内容,我将其放入 camelCase 中。

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

于 2010-05-12T00:11:46.420 回答
2

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

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

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

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

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

于 2010-05-12T00:18:02.540 回答
1

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

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

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

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

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

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

  6. 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_USERNAME或者label = UNSET_LABEL它只是更具描述性!

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

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

但这只是我的 2 美分。

于 2010-05-12T00:47:43.200 回答