python进阶

Python编码规范

2017-02-06  本文已影响135人  帝Bug

Python编码规范

1 排版

1.1 Indentation缩进

在参数过多时适当缩进

foo = long_function_name(var_one, var_two,
                         var_three, var_four)

def long_function_name(
    var_one, var_two, var_three,
    var_four):
print(var_one)

换行应该使用同级的缩进

Yes:

foo = long_function_name(
    var_one, var_two,
    var_three, var_four)

No:

foo = long_function_name(var_one, var_two,
    var_three, var_four)

Yes:

if (this_is_one_thing and
    that_is_another_thing):
    do_something()

注释需要具有相同的缩进

if (this_is_one_thing and
    that_is_another_thing):
    # Since both conditions are true, we can frobnicate.
    do_something()

以关系符开始应该增加缩进

if (this_is_one_thing
        and that_is_another_thing):
    do_something()

变量声明中应该有相同的缩进

my_list = [
    1, 2, 3,
    4, 5, 6,
    ]
result = some_function_that_takes_arguments(
    'a', 'b', 'c',
    'd', 'e', 'f',
    )

1.2 最大行长

所有行最大长度被限制在79个字符

with open('/path/to/some/file/you/want/to/read') as file_1,\
open('/path/to/some/file/being/written', 'w') as file_2:
    file_2.write(file_1.read())

过长需要续行使用’\’二元操作符的位置

No: 操作符里操作数过远

income = (gross_wages +
          taxable_interest +
         (dividends - qualified_dividends) -
          ira_deduction -
          student_loan_interest)

Yes: 正确的方式可以更容易的去匹配操作符与操作数

income = (gross_wages
        + taxable_interest
        + (dividends - qualified_dividends)
        - ira_deduction
        - student_loan_interest)

1.3空行

Python2使用ASCII编码或者Python3使用UTF-8编码,不应该声明编码类型。
所以在使用Python2时,我们应该在源文件开始声明编码类型。
#coding=utf-8

1.4 Import引入

Yes:

import os       
import sys

No:

import sys, os

It's okay to say this though:

from subprocess import Popen, PIPE

引入声明应该总是在文件顶部,仅在任何模块的注释和文档字符后面,同时也要处在全局变量和常量声明之前。

引入应该按照下面的顺序分组并书写

  1. 标准库
  2. 相关第三方库
  3. 本地 应用/库 特殊量的引入

你应该用空行隔开每个分组

• 在用户包/或者可引用的文件夹外的文档内import 模块应该使用绝对引用的方式

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

• 在用户包内import 模块应该使用相对引用的方式,确保包内路径的可靠性

from . import sibling

从当前目录下引用

from .. import x

从当前目录上层文件夹引用

from .sibling import example

从当前目录下sibling层引用

标准库应当总是绝对引用

应当尽量避免使用下面的引入方式:

from <module> import *

1.4 行内注释

如下

x = x + 1                 # Increment x

这样会更有意义:

x = x + 1                 # Compensate for border

2. 命名要求

2.1 最重要的规则

作为为其他用户开放的公共变量的名字必须遵循管理,而且能够显示它的用途

2.2 命名形式

有很多不同的命名方式,下面的命名方式都是可以使用

Note: 当使用驼峰是命名的时候,应当将命名中的缩写全部用大写表示. 因此 HTTPServerError 要比HttpServerError更好。
mixedCase (不同于CapitalizedWords在首字母的大小写上),

Capitalized_Words_With_Underscores (这是个很丑的方式)

_single_leading_underscore : 弱的内部变量标示. 当使用语句
from M import *语句引入模块时并不会引用以单个下划线开头的变量。

single_trailing_underscore_ : 使用后单个下划线来避免变量名与python关键词的冲突,如:class_class

__double_leading_underscore : 当命名一个类属性是,以双下划线开头, 启用命名矫正功能(在类FooBar内, __boo变成了_FooBar__boo)。

double_leading_and_trailing_underscore : 以双下划綫开头和结尾Python中可以重载的一些魔法方法。

E.g.__init__ , __import__ or __file__ . 不要去创造相似的名字。

3. 指定的: 命名规则

3.1 需要避免的命名

3.2 包和模块名

3.3 类命名

Note that there is a separate convention for builtin names: most builtin names are single words (or two words run together), with the CapWords convention used only for exception names and builtin constants.

3.4 类型变量名

3.5 异常名

因为异常是一个类, 按照已经提供的类命名方法来命名。你还需要在你的异常名后面添加"Error"后缀(如果它真的是一个错误).

3.6 全局变量命名

3.7 函数命名

函数名应该是小写,有必要为了提高可阅读性可以使用下划线将单词分开。

mixedCase被允许使用,仅仅是为了延续上文中使用的经典命名方式(e.g. threading.py)来维持向前的兼容性

3.8 函数和方法参数

3.9 方法名和实例变量

注意: 对于__names的使用时存在一些争议的(见下文)。

3.10 常量

3.11 继承的设计

有了这些考虑,下面是一些python化的指引:

Note 1: Property只工作于新式的类。

Note 2: Try to keep the functional behavior side-effect free, although side-effects such as caching are generally fine.

Note 3: 在计算密集型的操作中避免使用property的方法。

Note 1: 注意只有简单的类命名被用于矫正命名。所以当有一个子类选择相同的类名和相同的属性名,你还是会有命名冲突。

Note 2: 命名矫正较不方便的用在确定的用途上,比如调试或者获得属性(getattr()方法),尽管命名矫正算法已经有了很好的文档,也可以简单的手动实施。

Note 3: 并不是每个人都喜欢命名矫正,试着去平衡的使用它来降低高级调用者潜在的使用中出现意外的命名冲突的可能性。

4. 公开和内部接口

5. 编程建议

5.1 基本建议

5.2 比较操作

5.3 异常处理

5.4 with语句

5.5 return语句

5.6 字符串操作

5.7 类型比较

注意在Python3中unicode和basestring都不存在了(只有str类型),同时一个字节对象也不再是一种类型的字符串了(它是一个整型序列了)。

上一篇 下一篇

猜你喜欢

热点阅读