Python的常见编码风格是什么?

13

我对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.- 缩进是用制表符还是空格?
目前使用的是四个空格的制表符。

6.- 变量命名风格是什么? 我将所有的变量都使用小写字母,但对于类名我使用驼峰式。

您有什么建议吗?


3
如果你已经看过 PEP 8 的话,可能没有其他被广泛接受的标准了。 - David Z
@David:谢谢,我会遵循PEP 8的规则。 @Fuzzy lollipop:为什么? - CastleDweller
2
这是一句引言:“没有比看起来像一系列空格但实际上不是的字符更糟糕的了,它们看起来像不同数量的空格,取决于您的显示设置,并且您可能甚至无法在不重新配置编辑器的情况下输入!任何编辑器都可以让您输入空格,这就是我最近检查过的。” 这基本上概括了一切。 - user177800
1
@Oscar Carballal:无论太空狂热者怎么说,制表符并不邪恶(除非与空格混用,这基本上是所有人都认为邪恶的)。有完全合法、理性的理由喜欢制表符。然而,如果你计划与其他人合作(如果你谈论一个开源项目,这几乎是必然的),出于实用主义的考虑,你需要转换为使用全部空格。 - John Y
我已经使用制表符很多年了;不,它们并不是邪恶的。然而,Python 3 的更改在混合使用制表符和空格时会抛出错误,这非常邪恶:这意味着您必须更改编辑器的配置才能编辑不同的代码库,在学术和实践中都没有任何好处。 - Glenn Maynard
3个回答

20

PEP 8基本上是所有常见风格指南的“根源”。

谷歌的Python风格指南有一些非常好的部分,但其他部分比较古怪(例如两个空格缩进而不是流行的四个空格缩进,函数和方法使用CamelCase风格而不是camel_case风格等)。

下面回答你的具体问题:

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

80列是最受欢迎的。

2.- 使用哪种引号?(我看到过各种各样的引号,PEP 8没有提到明确的内容)我用单引号代替所有内容,但文档字符串使用三重双引号。

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

3.- 我应该把导入放在哪里?我将它们放在文件头中,按照以下顺序:

import sys import -需要的其他Python模块-

import whatever import -应用程序的其他模块-

是的,这个选择很好,也很流行。

4.- 我可以使用“import whatever.function as blah”吗?我看到一些文档忽略了这样做。

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

5.- 缩进使用制表符还是空格? 目前使用4个空格的制表符。

绝大多数人选择了空格作为缩进方式。

6.- 变量命名风格?我使用小写字母来表示所有变量,但对于类,我会使用驼峰式大小写。

几乎所有人都会将类的首字母大写,常量全大写。


谢谢!我会遵循您的建议,导入模块而不是函数 :) - CastleDweller
7
更新:谷歌的风格指南已经消除了之前提到的两个异类标准,现在采用的是与 PEP 8 相一致的规范,包括:1)使用 4 个空格缩进:https://google.github.io/styleguide/pyguide.html#Indentation,以及 2)在函数和方法名称中使用下划线:https://google.github.io/styleguide/pyguide.html#Naming。 - skeller88

2
1.- 现在大多数人都有16:9或16:10的显示器。即使他们没有宽屏,也有很多像素,80列不再像以前那样是一个大问题,当每个人都在320 X 240的4:3监视器上通过远程终端窗口进行命令行操作时,这是一个巨大的实际障碍。通常我会在行太长时结束它,这是主观的。我使用的是23英寸显示器X 2,分辨率为2048 X 1152。

2.- 默认使用单引号,因此您无需转义双引号,需要嵌入单引号时使用双引号,需要带有嵌入换行符的字符串时使用三引号。

3.- 将它们放在文件顶部,有时如果它们对模块没有全局需求,则将它们放在main函数中。

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个,只要不使用制表符

6.- 类应该使用UpperCaseCamelStyle,变量通常是小写的lowerCamelCase,有时是全部小写并用下划线分隔,函数名也是如此。"常量"应该全部大写并用下划线分隔ALL_UPPER_CASE_SEPARATED_BY_UNDERSCORES

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


80列让你可以在手机/手持设备上编码,当我需要通过终端工作时(例如:X服务器崩溃),这样做会更容易,因为80列总是适合它。此外,所有的屏幕都可以并排放置两个80列窗口,我通常同时打开4个或更多源以进行交叉引用。如果你把东西做得太垂直,那么就很难跟踪...我想这并不重要,因为你可以使用自动格式化程序... - L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳
3
对于有关80列包装的罕见常识给予+1。PEP8建议在80列处进行换行即使在撰写时也已经过时了,只会弄乱代码而已。请在大约120列处进行换行。如果确实还有人在80x25上编辑代码,那么他们应该可以应对。 - Glenn Maynard
1
-1 对于80列换行的评论。这不是因为它过时,而是因为要最有效地利用屏幕空间,因为屏幕仍然是横向长的。这使得在典型屏幕上轻松对齐4列代码的80个字符。在这种环境中看到没有保持在80列的代码非常难看。至于关于难以跟上的原始评论:不用担心它,当您准备维护它时,运行像autopep8这样的脚本会更容易。 - Bobby

1

由于我非常热衷于“样式”,所以我将记录下我目前在一个近8k SLOC项目中使用的指南,其中大部分符合PEP8。

1. PEP8说79(什么鬼?),我用80,而且现在已经习惯了。毕竟眼睛动得少! 2. 文档字符串和跨越多行的东西用'''。其他都用''。另外,我不喜欢双引号,我一直只用单引号...可能是因为我来自JavaScript领域,在那里使用''更容易,因为这样就不必转义所有的HTML内容:O 3. 在头部,内置代码优先于自定义应用程序代码。但我也采取“尽早失败”的方法,所以如果有某些依赖版本的东西(例如GTK),我会首先导入它。 4. 取决于情况,大多数时候我使用import foo和from foo import,但在某些情况下(例如名称已被另一个导入定义),我也会使用from foo import bar as bla。 5. 4个空格。就这样。如果你真的想使用制表符,在使用SCM时确保将其转换为空格后再提交。但绝对不能混合使用制表符和空格!!!这可能会引入可怕的错误。 6. some_method或foo_function,一个常量,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更糟糕...

但这只是我的个人看法。


我的2048X1152显示器在12点字体大小下,180列的标记语言有足够的空间! - user177800

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接