PEP8编码规范,及开发中的一些惯例和建

发布时间:2019-03-02 10:49:08编辑:auto阅读(2188)

    为什么要有编码规范

      规范的代码给人的第一感觉是【美观】,美的东西总是更加的吸引人,也愿意观看。不规范的代码风格总是令人感到难受,检查会很困难。所以美观带来的是代码的【可读性】强,想一想你写的代码可读性非常高,是不是检查起来容易,维护起来也更加容易,所以可读性强带来的是代码的【可维护性】强。最终你的代码【健壮性】高,不容易出BUG,即使出了也较容易解决。代码绝不是只要运行成功就可以了,从长远看,一定是易于维护的代码,才是对整个项目是最有利的代码。编写规范的代码是程序员必须养成的习惯。

    错误的代码编写示例

    from django.conf import settings
    from user.models import *
    import sys, os
    mod=0xffffffff
    def foo  ( a , b = 123 ):
        c={ 'x' : 111 , 'y' : 222 }#定义一个字典
        d=[ 1 , 3,5 ]
        return a,b , c
    def bar(x):
        if x%2==0 : return True

     

    正确的代码编写

     1 '''
     2 PEP8
     3 '''
     4 
     5 import os
     6 import sys
     7 
     8 from django.conf import settings
     9 from django.core import xxx
    10 
    11 from user.models import User
    12 from user.models import Perm
    13 
    14 XYZ_MOD = 0xffffffff
    15 
    16 
    17 def foo(a, b=123):
    18     '''this is foo'''
    19     c = {'x': 111, 'y': 222}
    20     d = [1, 3, 5]
    21     return a, b, c
    22 
    23 
    24 def bar(x):
    25     '''this is bar'''
    26     if x % 2 == 0:
    27         box = {k * 3: v * 10 for k, v in zip(range(10), range(3, 50)) if k % 2 == 0}  # as;df;asdfj
    28         return True
    29 
    30 
    31 class ThisIsBox:
    32     '''this class A'''
    33     def foo(self):
    34         pass
    35 
    36     class Meta:
    37         pass
    • 代码编排
      • 缩进4个空格,禁止空格与Tab混用
      • 行长80字符,防止单行逻辑过于复杂import
      • 不要使用 from xxx import * 这种语法
        • 文件 xyz.py
        • __all__ = ('a', 'e', '_d')   # 包含在这里面的能被import到其他模块里面使用
          
          a = 123
          _b = 456                    
          c = 'asdfghjkl'
          _d = [1,2,3,4,5,6]
          e = (9,8,7,6,5,4)
        • 文件 abc.py
        • from xyz import *          # 用这种语法导入的时候,除了__all__中的变量,带下划线的是导入不进来的。   
          print(a) print(_b) print(c) print(_d) print(e) 
      • 顺序
        • 单行不要 import 多个库
        • 第一层:标准库
        • 第二层:第三方库
        • 第三层:自定义库
      • 模块内用不到的不要去 import      
    • 空格
      • 问号和逗号后面跟一个空格,前面无空格。
      • 二元操作符前后各一个空格,包括以下几类:
      • 数学运算符      + - * / // = & | 
      • 比较运算符      == != > < >= <= is not in 
      • 逻辑运算符      and or not 
      • 位运算符         & | ^ << >> 
      • 当=用于只是关键字参数或默认参数值时,不要在其两侧使用空格
    • 适当添加空行
      • 函数间:顶级函数间空2行,类的方法之间空1行
      • 函数内:同一函数内逻辑块之间,空一行
      • 文件结尾:留一个空行 
    • 注释
      • 两点需要避免:①逐行添加注释②没有一个注释
      • 行尾注释:单行逻辑过于复杂时添加
      • 块注释:一段逻辑开始时添加
      • 引入外来算法或者配置时须在注释中添加源连接,标明出处
      • 函数、类、模块尽可能添加docstring
    • 命名
      • 好的变量名 要能做到"词能达意"
      • 除非在lambda函数中,否则不要使用单字母的变量名(即使是lambda函数中的变量名也要尽可能的有意义)
      • 包名、模块名、函数名、方法、普通变量名全部使用小写, 单词间用下划线连接
      • 类名、异常名使用 CapWords (首字母大写) 的方式, 异常名结尾加 ErrorWraning 后缀
      • 全局变量尽量使用大写, 一组同类型的全局变量要加上统一前缀, 单词用下划线连接
      • 函数名必须有动词, 最好是 do_something 的句式, 或者 somebody_do_something 句式
    • 语意明确、直白
      • not xx in yy   VS   xx not in yy
      • not a is b     VS   a is not b
    • 程序的构建
      • 函数是模块化思想的体现
      • 独立的逻辑应该抽离成独立函数,让代码结构更清晰,可复用度更高
      • 一个函数只做一件事情, 并把这件事做好
      • 大的功能用小函数之间灵活组合来完成
      • 避免编写庞大的程序, “大” 意味着体积庞大, 逻辑复杂甚至混乱
    • 自定义的变量名、函数名不要与标准库中的名字冲突

关键字