目录

  • 阅读源
  • 规范
  • 分号
  • 行长度
  • 括号
  • 缩进
  • 空行
  • 空格
  • Shebang
  • 注释
  • 字符串
  • 文件和sockets
  • TODO注释
  • 语句
  • 访问控制
  • main

阅读源

Google开源项目风格指南

说明: 本文不好理解的地方,前往风格指南自行查阅;

规范

  1. 规范一:
    PEP 8 --> 个人,小群体
  2. 规范二:
    Google Style --> 大团队,企业
    规范二比规范一更加严格

分号

  1. 分号
    ① 不要在行尾加分号;
    ② 也不要用分号将两条命令放在同一行。

行长度

  1. 行长度
    ① 每行不超过80个字符;
    PS:PyCharm中 < 120个字符;
    例外:
    ① 长的导入模块语句
    ② 注释里的URL
    ② 不要使用反斜杠连接行
    Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以利用这个特点.
    如果需要, 你可以在表达式外围增加一对额外的圆括号.

     Yes: foo_bar(self, width, height, color='black', design=None, x='foo',emphasis=None, highlight=0)if (width == 0 and height == 0 andcolor == 'red' and emphasis == 'strong'):
    

    如果一个文本字符串在一行放不下, 可以使用圆括号来实现隐式行连接:

     x = ('This will build a very long long ''long long long long long long string')
    

    在注释中,如果必要,将长的URL放在一行上。

     Yes:  # See details at# http://www.example.com/us/developer/documentation/api/content/v2.0/csv_file_name_extension_full_specification.htmlNo:   # See details at# http://www.example.com/us/developer/documentation/api/content/\# v2.0/csv_file_name_extension_full_specification.html
    

括号

  1. 括号
    宁缺毋滥的使用括号
    除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.

     Yes: if foo:bar()while x:x = bar()if x and y:bar()if not x:bar()return foofor (x, y) in dict.items(): ...No:  if (x):bar()if not(x):bar()return (foo)
    

缩进

  1. 缩进
    用4个半角空格来缩进代码
    绝对不要用tab, 也不要tab和空格混用.
    对于行连接的情况, 你应该要么垂直对齐换行的元素(见 行长度 部分的示例),
    或者使用4空格的悬挂式缩进(这时第一行不应该有参数):

     Yes:   # Aligned with opening delimiterfoo = long_function_name(var_one, var_two,var_three, var_four)# Aligned with opening delimiter in a dictionary
    foo = {long_dictionary_key: value1 +value2,...
    }# 4-space hanging indent; nothing on first line
    foo = long_function_name(var_one, var_two, var_three,var_four)# 4-space hanging indent in a dictionary
    foo = {long_dictionary_key:long_dictionary_value,...
    }  Yes:
    # Aligned with opening delimiter
    foo = long_function_name(var_one, var_two,var_three, var_four)# Aligned with opening delimiter in a dictionary
    foo = {long_dictionary_key: value1 +value2,...
    }# 4-space hanging indent; nothing on first line
    foo = long_function_name(var_one, var_two, var_three,var_four)# 4-space hanging indent in a dictionary
    foo = {long_dictionary_key:long_dictionary_value,...
    }No:    # Stuff on first line forbiddenfoo = long_function_name(var_one, var_two,var_three, var_four)# 2-space hanging indent forbiddenfoo = long_function_name(var_one, var_two, var_three,var_four)# No hanging indent in a dictionaryfoo = {long_dictionary_key:long_dictionary_value,...}
    

空行

  1. 空行

    # =============================
    总结:
    1. 在顶级代码块定义之间空两行;
    2. 在类中的方法、类定义之间空一行;
    3. 在函数、方法、类中,在你觉得合适的地方,就空一行;
    4. 在整体代码末尾要空一行;
    # =============================
    

    顶级定义之间空两行, 方法定义之间空一行
    顶级定义之间空两行, 比如函数或者类定义.
    方法定义, 类定义与第一个方法之间, 都应该空一行.
    函数或方法中, 某些地方要是你觉得合适, 就空一行.

空格

  1. 空格
    按照标准的排版规范来使用标点两边的空格
    ① 括号内不要有空格.

     Yes: spam(ham[1], {eggs: 2}, [])No:  spam( ham[ 1 ], { eggs: 2 }, [ ] )
    

② 不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).

 Yes: if x == 4:print x, yx, y = y, xNo:  if x == 4 :print x , yx , y = y , x

③ 参数列表, 索引或切片的左括号前不应加空格.

 Yes: spam(1)no: spam (1)Yes: dict['key'] = list[index]No:  dict ['key'] = list [index]

④ 在二元操作符两边都加上一个空格,
比如赋值(=), 比较(==, <, >, !=, <>, <=, >=, in, not in, is, is not), 布尔(and, or, not).
至于算术操作符两边的空格该如何使用, 需要你自己好好判断. 不过两侧务必要保持一致.

 Yes: x == 1No:  x<1

⑤ 当’=’用于指示关键字参数或默认参数值时, 不要在其两侧使用空格.

 Yes: def complex(real, imag=0.0): return magic(r=real, i=imag)No:  def complex(real, imag = 0.0): return magic(r = real, i = imag)

⑥ 不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等):

 Yes:foo = 1000  # commentlong_name = 2  # comment that should not be aligneddictionary = {"foo": 1,"long_name": 2,}No:foo       = 1000  # commentlong_name = 2     # comment that should not be aligneddictionary = {"foo"      : 1,"long_name": 2,

Shebang

  1. Shebang

    # ==============================================
    总结:
    根据PEP-394,程序的main文件,也就是被直接执行的文件或者说是用作脚本执行的
    文件才有必要加入#!,其他模块文件中的#!将被忽略。
    # ==============================================
    

    大部分.py文件不必以#!作为文件的开始.
    根据 PEP-394 , 程序的main文件应该以 #!/usr/bin/python2或者 #!/usr/bin/python3开始.

    (译者注: 在计算机科学中, Shebang (也称为Hashbang)是一个由井号和叹号构成的字符串行(#!),
    其出现在文本文件的第一行的前两个字符. 在文件中存在Shebang的情况下,
    类Unix操作系统的程序载入器会分析Shebang后的内容, 将这些内容作为解释器指令, 并调用该指令,
    并将载有Shebang的文件路径作为该解释器的参数.
    例如, 以指令#!/bin/sh开头的文件在执行时会实际调用/bin/sh程序.)

    #!先用于帮助内核找到Python解释器,
    但是在导入模块时, 将会被忽略.
    因此只有被直接执行的文件中才有必要加入#!.

注释

  1. 注释

    # ==========================================================
    总结:
    要在包、模块、函数、生成器、类、方法中书写文档字符串,并且
    根据PEP 257,惯例使用三重双引号。"""..."""什么是文档字符串?是Python中独一无二的注释方式,是包、模块、函数、生成器、类、方法里的第一个语句,这些字符串通过对象的__doc__成员被自动提取,并且被pydoc所用。书写形式基本格式:第一行:以句号、问好或感叹号结尾的概述;第二行:空行;接着是文档字符串剩下的部分,要与文档字符串的第一行的第一个引号对齐。具体格式:(一)文档字符串1. 包、模块书写根据项目的使用许可,选择合适的样板2. 函数、生成器以及方法函数必须要有文档字符串,除非:a. 对外部不可见b. 简单明了c. 非常短小书写格式:"""这一行:函数(函数、方法、生成器)是做什么的(函数的作用)概述这一行:对函数详细的描述Args: / :params 参数名字: (__表示两个空格,节的内容都应该缩进2个空格)__参数名字: 类型,含义(含义,如果>80 chars,则使用2或4个空格悬挂缩进)__*args: 描述args__*kwargs: 描述kwargsReturns: / Yields:__类型,含义,还可以举例(如果返回为None,可以省略)Raises:__IOError: An error occurred accessing the bigtable.Table object."""3. 类"""这一行:类是做什么的(类的作用)概述这一行:对类详细的描述Attributes: (如果类包含公共属性的话,文档字符串需要书写一个Attributes段)__sports: 类型,含义__computers: 类型,含义"""(二)单行注释1. 没必要全加注释,在自己觉得重要或者不好理解的地方加即可;2. 注释内容的字符可以使用英文或中文,但不要使用拼音;3. 注释内容,不要描述代码,应描述这行代码是做什么的;4. 对于复杂的操作,应在操作前加上若干注释;5. 对于不是一目了然的操作,应该行尾加注释;6. 对于代码行内的注释:a. 应先空2个空格;b. 再写注释符号;c. 再空1个空格;d. 最后写内容。# =============================================================

    具体说明:
    ① 文档字符串
    python有一种独一无二的的注释方式: 使用文档字符串.
    文档字符串是包, 模块, 类或函数里的第一个语句.
    这些字符串可以通过对象的__doc__成员被自动提取, 并且被pydoc所用.
    (你可以在你的模块上运行pydoc试一把, 看看它长什么样).

    我们对文档字符串的惯例是使用三重双引号"""…"""( PEP-257 ).

    一个文档字符串应该这样组织:
    首先是一行以句号, 问号或惊叹号结尾的概述(或者该文档字符串单纯只有一行).
    接着是一个空行.
    接着是文档字符串剩下的部分, 它应该与文档字符串的第一行的第一个引号对齐.

    ② 模块
    每个文件应该包含一个许可样板. 根据项目使用的许可(例如, Apache 2.0, BSD, LGPL, GPL), 选择合适的样板.

    ③ 函数和方法
    下文所指的函数,包括函数, 方法, 以及生成器.

    一个函数必须要有文档字符串, 除非它满足以下条件:

     外部不可见非常短小简单明了
    

    文档字符串应该包含函数做什么, 以及输入和输出的详细描述.
    通常, 不应该描述”怎么做”, 除非是一些复杂的算法.
    文档字符串应该提供足够的信息, 当别人编写代码调用该函数时,
    他不需要看一行代码, 只要看文档字符串就可以了.
    对于复杂的代码, 在代码旁边加注释会比使用文档字符串更有意义.

    关于函数的几个方面应该在特定的小节中进行描述记录,
    这几个方面如下文所述. 每节应该以一个标题行开始.
    标题行以冒号结尾. 除标题行外, 节的其他内容应被缩进2个空格.
    Args:
    列出每个参数的名字, 并在名字后使用一个冒号和一个空格,
    分隔对该参数的描述.如果描述太长超过了单行80字符,
    使用2或者4个空格的悬挂缩进(与文件其他部分保持一致).
    描述应该包括所需的类型和含义. 如果一个函数接受foo(可变长度参数列表)或者**bar (任意关键字参数),
    应该详细列出
    foo和**bar.

    Returns: (或者 Yields: 用于生成器)
    描述返回值的类型和语义. 如果函数返回None, 这一部分可以省略.

    Raises:
    列出与接口有关的所有异常.

 """def fetch_bigtable_rows(big_table, keys, other_silly_variable=None):"""Fetches rows from a Bigtable.Retrieves rows pertaining to the given keys from the Table instancerepresented by big_table.  Silly things may happen ifother_silly_variable is not None.Args:big_table: An open Bigtable Table instance.keys: A sequence of strings representing the key of each table rowto fetch.other_silly_variable: Another optional variable, that has a muchlonger name than the other args, and which does nothing.Returns:A dict mapping keys to the corresponding table row datafetched. Each row is represented as a tuple of strings. Forexample:{'Serak': ('Rigel VII', 'Preparer'),'Zim': ('Irk', 'Invader'),'Lrrr': ('Omicron Persei 8', 'Emperor')}If a key from the keys argument is missing from the dictionary,then that row was not found in the table.Raises:IOError: An error occurred accessing the bigtable.Table object."""pass

④ 类
类应该在其定义下有一个用于描述该类的文档字符串.
如果你的类有公共属性(Attributes), 那么文档中应该有一个属性(Attributes)段.
并且应该遵守和函数参数相同的格式.

class SampleClass(object):"""Summary of class here.Longer class information....Longer class information....Attributes:likes_spam: A boolean indicating if we like SPAM or not.eggs: An integer count of the eggs we have laid."""def __init__(self, likes_spam=False):"""Inits SampleClass with blah."""self.likes_spam = likes_spamself.eggs = 0def public_method(self):"""Performs operation blah."""

⑤ 块注释和行注释
最需要写注释的是代码中那些技巧性的部分. 如果你在下次 代码审查 的时候必须解释一下, 那么你应该现在就给它写注释.

对于复杂的操作, 应该在其操作开始前写上若干行注释.

对于不是一目了然的代码, 应在其行尾添加注释.

# We use a weighted dictionary search to find out where i is in
# the array.  We extrapolate position based on the largest num
# in the array and the array size and then do binary search to
# get the exact number.if i & (i-1) == 0:        # True if i is 0 or a power of 2.为了提高可读性, 注释应该至少离开代码2个空格.另一方面, 绝不要描述代码. 假设阅读代码的人比你更懂Python, 他只是不知道你的代码要做什么.
# BAD COMMENT: Now go through the b array and make sure whenever i occurs
# the next element is i+1

  1. # ====================================
    总结:
    为了不受PEP-3000一个特殊的潜在不兼容性影响,如果
    一个类不继承自其它类,就显式地从object继承,嵌套类也一样。
    # ====================================
    

    如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.

     Yes: class SampleClass(object):passclass OuterClass(object):class InnerClass(object):passclass ChildClass(ParentClass):"""Explicitly inherits from another class already."""No: class SampleClass:passclass OuterClass:class InnerClass:pass
    

继承自 object 是为了使属性(properties)正常工作, 并且这样可以保护你的代码,
使其不受 PEP-3000 的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方法实现了对象的默认语义,
包括 new, init, delattr, getattribute, setattr, hash, repr, and str .

字符串

  1. 字符串
    10.1 即使参数都是字符串, 使用%操作符或者格式化方法格式化字符串. 不过也不能一概而论, 你需要在+和%之间好好判定.

    Yes: x = a + bx = '%s, %s!' % (imperative, expletive)x = '{}, {}!'.format(imperative, expletive)x = 'name: %s; score: %d' % (name, n)x = 'name: {}; score: {}'.format(name, n)No: x = '%s%s' % (a, b)  # use + in this casex = '{}{}'.format(a, b)  # use + in this casex = imperative + ', ' + expletive + '!'x = 'name: ' + name + '; score: ' + str(n)
    

    原则:
    1. 如果拼接后的字符串长度<=20,可以直接用 +
    2. 如果超过20,那么就用%操作符或者格式化方法来格式化字符串
    3. 避免在循环中用+和+=来累加字符串。由于字符串是不可变的,这样做
    会创建不必要的临时对象,并且导致二次方而不是线性的运行时间。
    作为替代方案,可以将每个子串加入列表,然后在循环结束后用.join方法来连接列表
    4. 或者使用io.StringIO来缓存字符串

10.2 在同一个文件中,保持使用字符串引号的一致性。
在同一文件中,使用单引号或者双引号之一用以引用字符串。
在字符串内可以使用另外一种引号,以避免字符串引号匹配问题。

10.3 为多行字符串使用三重双引号而非三重单引号。
当且仅当项目中使用单引号来引用字符串时,才可能会使用三重单引号为非文档字符串的多行字符串来标识引用。
文档字符串必须使用三重双引号。
不过,通常用隐式行连接,因为多行字符串与程序其他部分的缩进方式不一致。

文件和sockets

  1. 文件和sockets
    在文件和sockets结束时, 显式的关闭它。

除文件外,sockets或其他类似文件的对象在没有必要的情况下打开,会有许多副作用
1. 他们可能会消耗有限的系统资源,如文件描述符。如果这些资源在使用后没有及时归还系统,
那么用于处理这些对象的代码会将资源消耗殆尽。
2. 持有文件将会阻止对于文件的其他诸如移动、删除之类的操作。
3. 仅仅是从逻辑上关闭文件和sockets,那么他们仍然可能会被其共享的程序在无意中进行读或者写操作。
只有当它们真正被关闭后,对于它们尝试进行读或者写操作将会抛出异常,并使得问题快速显现出来。

另外,幻想当文件对象析构时,文件和sockets会自动关闭,试图将文件对象的生命周期和文件的状态绑定在一起的想法,都是不现实的,因为:
1. 没有任何方法可以确保运行环境会真正的执行文件的析构,不同的Python解释器实现采用不同的内存管理技术,比如延时垃圾回收机制,
延时垃圾回收机制可能会导致对象生命周期被任意无限制的延长。
2. 对于文件意外地引用,会导致对于文件的持有时间超出预期(比如对于异常的跟踪,包含有全局变量等)

推荐使用过with语句来管理文件

with open("hello.txt") as hello_file:for line in hello_file:print line

对于不支持使用with语句的类似文件的对象,使用contextlib.closing()

import contextlibwith contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:for line in front_page:print line

TODO注释

  1. TODO注释
    为临时代码使用TODO注释,它是一种短期解决方案,不算完美,但够好了。
    TODO注释应该在所有开头处包含TODO字符串,紧跟着是用括号括起来的你的名字、email地址或者其他标识符。
    然后是一个可选的冒号,接着必须有一行注释,解释要做什么。
    主要目的是为了有一个统一的TODO格式,这样添加注释的人就可以搜索到(并可以按需提供更多细节)。
    写了TODO注释并不保证写的人会亲自解决问题。

    # TODO(kl@gmail.com): Use a "*" here for string repetition.
    # TODO(Zeke) Change this to use relations.
    

    如果你的TODO是“将来做某事”的形式,那么确保你包含了一个指定的日期(2009年11月解决)
    或者一个特定的事件(例如:”等所有的客户都可以处理XML请求就移除这些代码“)

    额外

    # 1、TODO
    等待实现的功能
    将等下要做的事情先记下来
    # 2、FIXME
    需要修正的功能
    # 3、XXX
    需要改进的功能
    
  2. 导入格式

    # ====================================================
    总结:
    1. 导入位于模块注释和文档字符串之后,模块全局变量和常量之前;
    2. 每个导入应该独占一行;
    3. 导入应按照最通用到最不通用的顺序分组;标准库导入第三方库导入应用程序指定导入
    4. 每种分组中,应该根据每个模块的完整包路径按字典顺序排序,忽略大小写。
    # ==================================================
    

每个导入应该独占一行

Yes: import osimport sys
No:  import os, sys

导入总应该放在文件顶部,位于模块注释(解释器运行环境)和文档字符串之后,模块全局变量和常量之前。
导入应按照从最通用到最不通用的顺序分组:

  1. 标准库导入
  2. 第三方库导入
  3. 应用程序指定导入

每种分组中,应该根据每个模块的完整包路径按字典顺序排序,忽略大小写。

import foo
from foo import bar
from foo.bar import baz
from foo.bar import Quux
from Foob import ar

语句

  1. 语句

    # =============================
    总结:
    通常每个语句应该独占一行(测试环境除外);
    如果是if语句,只有在没有else时并且代码块只有一条语句才允许放在同一行;
    不要对try/except这样做,因为try和except不能放在同一行。
    应是 is not 而不是not ... is ...;应是 not in 而不是 not ... in ...
    # =============================
    

通常每个语句应该独占一行
不过, 如果测试结果与测试语句在一行放得下, 你也可以将它们放在同一行.
如果是if语句, 只有在没有else时才能这样做.
特别地, 绝不要对 try/except 这样做, 因为try和except不能放在同一行.

Yes:if foo: bar(foo)
No:if foo: bar(foo)else:   baz(foo)try:               bar(foo)except ValueError: baz(foo)try:bar(foo)except ValueError: baz(foo)

访问控制

  1. 访问控制
# ============================================
总结:
在Python中,对于琐碎又不太重要的访问函数,应该直接使用公有变量取代,
这样可以避免额外的函数调用开销。当添加更多功能时,可以用property来
保持语法一致性。
如果访问操作复杂或者变量的访问开销很显著,应该使用像 get_foo() 和 set_foo() 这样的函数调用。
# ============================================

在Python中, 对于琐碎又不太重要的访问函数, 你应该直接使用公有变量来取代它们, 这样可以避免额外的函数调用开销.
当添加更多功能时, 你可以用属性(property)来保持语法的一致性.

(译者注: 重视封装的面向对象程序员看到这个可能会很反感, 因为他们一直被教育:
所有成员变量都必须是私有的! 其实, 那真的是有点麻烦啊. 试着去接受Pythonic哲学吧)

另一方面, 如果访问更复杂, 或者变量的访问开销很显著, 那么你应该使用像 get_foo() 和 set_foo() 这样的函数调用.
如果之前的代码行为允许通过属性(property)访问 , 那么就不要将新的访问函数与属性绑定.
这样, 任何试图通过老方法访问变量的代码就没法运行, 使用者也就会意识到复杂性发生了变化.

  1. 命名
    module_name,
    package_name,
    ClassName,
    method_name,
    ExceptionName,
    function_name,
    GLOBAL_VAR_NAME,
    instance_var_name,
    function_parameter_name,
    local_var_name.

应该避免的名称:

  1. 单字符名称, 除了计数器和迭代器.
  2. 包/模块名中的连字符(-)
  3. 双下划线开头并结尾的名称(Python保留, 例如__init__)

命名约定:

  1. 所谓”内部(Internal)”表示仅模块内可用, 或者, 在类内是保护或私有的.
  2. 用单下划线(_)开头表示模块变量或函数是protected的(使用from module import *时不会包含).
  3. 用双下划线(__)开头的实例变量或方法表示类内私有.
  4. 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
  5. 对类名使用大写字母开头的单词(如CapWords, 即Pascal风格),
    但是模块名应该用小写加下划线的方式(如lower_with_under.py).
    尽管已经有很多现存的模块使用类似于CapWords.py这样的命名,
    但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.

Python之父Guido推荐的规范:

Type Public Internal
Modules lower_with_under _lower_with_under
Packages lower_with_under  
Classes CapWords _CapWords
Exceptions CapWords  
Functions lower_with_under() _lower_with_under()
Global/Class Constants CAPS_WITH_UNDER _CAPS_WITH_UNDER
Global/Class Variables lower_with_under _lower_with_under
Instance Variables lower_with_under _lower_with_under (protected) or __lower_with_under (private)
Method Names lower_with_under() _lower_with_under() (protected) or __lower_with_under() (private)
Function/Method Parameters lower_with_under  
Local Variables lower_with_under  

main

  1. main

    # =========================================
    总结:
    即使是一个打算被用作脚本执行的文件,也应该是可导入的;
    主功能应该放在一个main()函数中;
    代码在执行主程序之前应总是检查 if __name__ == '__main__'
    # =========================================
    

即使是一个打算被用作脚本的文件,也应该是可导入的。
并且简单的导入不应该导致这个脚本的主功能(main functionality)被执行,
这是一种副作用。主功能应该放在一个main()函数中。

在Python中,pydoc以及单元测试要求模块必须是可导入的。
你的代码应该在执行主程序前总是检查
if __name__ == ‘__main__’,这样当模块被导入时主程序就不会被执行。

def main():...if __name__ == '__main__':main()

所有的顶级代码在模块导入时都会被执行.
要小心不要去调用函数, 创建对象, 或者执行那些不应该在使用pydoc时执行的操作.

Python3学习之Python风格指南相关推荐

  1. python3 中文手册Python 入门指南

    Python 是一门简单易学且功能强大的编程语言.它拥有高效的高级数据结构,并且能够用简单而又高效的方式进行面向对象编程.Python 优雅的语法和动态类型,再结合它的解释性,使其在大多数平台的许多领 ...

  2. Python 编码风格指南

    本节收录了稍作剪辑的PEP 8摘要(Python Enhancement Proposal,Python增强提案).PEP 8由Guido van Rossum和Barry Warsaw撰写,是Pyt ...

  3. PEP8 - Python 代码风格指南中英对照

    PEP8 - Python 代码风格指南中英对照 Introduction A Foolish Consistency is the Hobgoblin of Little Minds Code la ...

  4. python基础第三章选择结构答案-python3 学习笔记(二)选择结构、循环结构

    python3 学习笔记 python 优雅 明确 简单 1.选择结构 (1)简单判断 if else 使用格式: if  条件: 表达式1 else: 表达式2 (2)多条件判断 elif 使用格式 ...

  5. Python编码风格指南

    来源 | 异步图书 本节收录了稍作剪辑的PEP 8摘要(Python Enhancement Proposal,Python增强提案).PEP 8由Guido van Rossum和Barry War ...

  6. python没有联网_无网环境下的 Python 开发指南

    说起有关 Python 的指南,便一定得提到 K 神创建的『Python最佳实践指南』,英文名字是『The Hitchhiker's Guide to Python!』.毫不夸张地说,K 神创建的指南 ...

  7. 数据简化社区Google和Linux代码风格指南(附PDF公号发“代码风格”下载)

    数据简化社区Google和Linux代码风格指南(附PDF公号发"代码风格"下载) 秦陇纪2019代码类 数据简化DataSimp 昨天 数据简化DataSimp导读:数据简化社区 ...

  8. Software Engineering at Google翻译-III-8-Style Guides and Rules(风格指南和规则 )

    第8章 风格指南和规则 作者: Shaindel Schwartz 编辑: Tom Manshreck 参考:https://github.com/daizhenhong/swe-at-google/ ...

  9. Google C++ Style Guide - Google C++ 风格指南

    Google C++ Style Guide - Google C++ 风格指南 Every major open-source project has its own style guide: a ...

最新文章

  1. Linux CPU数量判断命令
  2. postman对象参数null_postman的几种参数格式
  3. 漫说单例模式--宝宝成长记 你真的了解了吗?
  4. kali中安转python3_Kali环境下安装Python3.7
  5. gensim提取一个句子的关键词_聊一聊 NLPer 如何做关键词抽取
  6. vc2010 mysql5.7_VC2010利用MySQL++访问mysql. 及连接池示例
  7. 苏格拉底的苹果_苏格拉底关于人生的教诲
  8. android滚动条布局平分,让你的布局滚动起来—ScrollView
  9. [CMake] set_property 和 set_target_properties
  10. MATLAB music分解信号,MUSIC算法信号频率问题求解
  11. 【经典传颂】人月神话The Mythical Man-Month
  12. spring中创建excl表的几种方式并导出
  13. JLINK V8更新固件
  14. 初窥MySQL的索引与事务
  15. 董老师走进斯坦福讲座
  16. 现在你可以通过深度学习用别人的声音来说话了
  17. 【苹果cms V10教程】资源采集站如何设置定时采集详细教程讲解
  18. 理解Flux机制和应用
  19. 【Linux】——库函数
  20. 群晖 mysql 端口配置_群晖DS218+部署mysql

热门文章

  1. java 返回上一个页面_页面返回上一页浏览位置
  2. python隐藏画笔_Python14_绘图小海龟(turtle)
  3. Linux驱动之按键驱动长按检测
  4. python读取文件的几种方式
  5. 纯css3豪斯医生卡通形象
  6. 如何给视频去水印?视频里面的水印怎么去掉?
  7. hdu 5222 Exploration
  8. HTML+CSS+JS网页设计期末课程大作业——多用途的图文展示博客HTML模板(16页) 学生DW网页设计作业成品 web课程设计网页规划与设计 计算机毕设网页设计源码...
  9. WinServer 2012 R2 搭建软路由、网关服务器实现NAT转发
  10. LT-D军用双目头盔显示器