Python编程规范
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python编程规范相关的知识,希望对你有一定的参考价值。
本节内容如下:
- 代码块大括号
- 分号
- 行长度
- 括号
- 缩进
- 空行
- 空格
- 类
- 导入格式
- 语句
- 命令
代码块大括号
代码使用缩进的方式,而不是大括号是Python语言规范中的一大特点,如果你有其他语言基础的话,可能需要适应一下:
flag = True if flag: print ( ‘代码块1‘ ) print ( ‘代码块2‘ ) else : print ( ‘代码块3‘ ) print ( ‘代码块4‘ ) |
分号
不要在行尾加分号, 也不要用分号将两条命令放在同一行。查看原文
行长度
每行不超过80个字符,以下情况除外:
- 长的导入模块语句
- 注释里的URL
括号
宁缺毋滥的使用括号
除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的.
Yes: if foo: bar() while x: x = bar() if x and y: bar() if not x: bar() return foo for (x, y) in dict .items(): ... No: if (x): bar() if not (x): bar() return (foo) |
缩进
用4个空格来缩进代码
绝对不要用tab, 也不要tab和空格混用. 对于行连接的情况, 你应该要么垂直对齐换行的元素群:369606713
Yes: # 与起始变量对齐 foo = long_function_name(var_one, var_two, var_three, var_four) # 字典中与起始值对齐 foo = { long_dictionary_key: value1 + value2, ... } # 4 个空格缩进,第一行不需要 foo = long_function_name( var_one, var_two, var_three, var_four) # 字典中 4 个空格缩进 foo = { long_dictionary_key: long_dictionary_value, ... } No: # 第一行有空格是禁止的 foo = long_function_name(var_one, var_two, var_three, var_four) # 2 个空格是禁止的 foo = long_function_name( var_one, var_two, var_three, var_four) # 字典中没有处理缩进 foo = { long_dictionary_key: long_dictionary_value, ... } |
空行
顶级定义之间空两行, 方法定义之间空一行
顶级定义之间空两行, 比如函数或者类定义. 方法定义, 类定义与第一个方法之间, 都应该空一行. 函数或方法中, 某些地方要是你觉得合适, 就空一行.
空格
按照标准的排版规范来使用标点两边的空格
括号内不要有空格.
按照标准的排版规范来使用标点两边的空格
Yes: spam(ham[ 1 ], {eggs: 2 }, []) No: spam( ham[ 1 ], { eggs: 2 }, [ ] ) |
不要在逗号, 分号, 冒号前面加空格, 但应该在它们后面加(除了在行尾).
Yes: if x = = 4 : print x, y x, y = y, x No: if x = = 4 : print x , y x , 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 = = 1 No: 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 # 注释 long_name = 2 # 注释不需要对齐 dictionary = { "foo" : 1 , "long_name" : 2 , } No: foo = 1000 # 注释 long_name = 2 # 注释不需要对齐 dictionary = { "foo" : 1 , "long_name" : 2 , } |
类
如果一个类不继承自其它类, 就显式的从object继承. 嵌套类也一样.
Yes: class SampleClass( object ): pass class OuterClass( object ): class InnerClass( object ): pass class ChildClass(ParentClass): """Explicitly inherits from another class already.""" No: class SampleClass: pass class OuterClass: class InnerClass: pass |
继承自 object 是为了使属性(properties)正常工作, 并且这样可以保护你的代码, 使其不受Python 3000的一个特殊的潜在不兼容性影响. 这样做也定义了一些特殊的方法, 这些方法实现了对象的默认语义, 包括 new, init, delattr, getattribute, setattr, hash, repr, and str .
导入格式
每个导入应该独占一行
Yes: import os import sys No: import os, sys |
导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组: 标准库导入 第三方库导入 应用程序指定导入 每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.
import foo from foo import bar from foo.bar import baz from foo.bar import Quux from Foob import ar |
语句
通常每个语句应该独占一行
不过, 如果测试结果与测试语句在一行放得下, 你也可以将它们放在同一行. 如果是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) |
命名规范
module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_VAR_NAME, instance_var_name, function_parameter_name, local_var_name. |
应该避免的名称
- 单字符名称, 除了计数器和迭代器.
- 包/模块名中的连字符(-)
- 双下划线开头并结尾的名称(Python保留, 例如init)
命名约定
- 所谓"内部(Internal)"表示仅模块内可用, 或者, 在类内是保护或私有的.
- 用单下划线(_)开头表示模块变量或函数是protected的(使用import * from时不会包含).
- 用双下划线(__)开头的实例变量或方法表示类内私有.
- 将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.
- 对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py). 尽管已经有很多现存的模块使用类似于CapWords.py这样的命名, 但现在已经不鼓励这样做, 因为如果模块名碰巧和类名一致, 这会让人困扰.
以上是关于Python编程规范的主要内容,如果未能解决你的问题,请参考以下文章
python3代码编程规范(命名空格注释代码布局编程建议等)