zoukankan      html  css  js  c++  java
  • python编程规范

    python编程规范

    缩进

    • 每一级缩进使用4个空格

    • 续行应该与其包裹元素对齐,要么使用括号内的隐式行连接来垂直对齐,要么使用挂行缩进对齐

    • 用挂行缩进时,应该考虑到第一行不应该有参数,以及使用缩进以区分自己是续行

     # 与左括号对齐
     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)
     
     # 挂行缩进应该再换一行
     foo = long_function_name(
         var_one, var_two,
         var_three, var_four)
     
     # 在条件判断的语句添加额外的缩进
     if (this_is_one_thing
             and that_is_another_thing):
         do_something()

    空格是首选的缩进方式,直接禁止使用tab键

    换行

     # 推荐:运算符和操作数很容易进行匹配
     income = (gross_wages
               + taxable_interest
               + (dividends - qualified_dividends)
               - ira_deduction
               - student_loan_interest)
    • 顶层函数和类的定义,前后用两个空行隔开。

    • 类里的方法定义用一个空行隔开。

    • 相关的功能组可以用额外的空行(谨慎使用)隔开。

    Imports 导入

    • 导入总是位于文件的顶部,在模块注释和文档字符串之后,在模块的全局变量与常量之前。

      导入应该按照以下顺序分组:

      1. 标准库导入

      2. 相关第三方库导入

      3. 本地应用/库特定导入

      4. 你应该在每一组导入之间加入空行。

    • 推荐使用绝对路径导入

    • 避免通配符的导入(from import *)

     

    模块级的“呆”名

    “呆名“(名字里有两个前缀下划线和两个后缀下划线)必须出现在除文档字符串之外的其他代码之前。

     """This is the example module.
     
     This module does stuff.
     """
     
     from __future__ import barry_as_FLUFL
     
     __all__ = ['a', 'b', 'c']
     __version__ = '0.1'
     __author__ = 'Cardinal Biggles'
     
     import os
     import sys

    表达式和语句中的空格

    在下列情况下,避免使用无关的空格:

    • 紧跟在小括号,中括号或者大括号后

    • 紧贴在逗号、分号或者冒号之前

    • 紧贴在函数参数、索引、切片的左括号之前

     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: dct['key'] = lst[index]
     No:  dct ['key'] = lst [index]

    其他建议

    • 避免在尾部添加空格。

    • 总是在二元运算符两边加一个空格:赋值(=),增量赋值(+=,-=),比较(==,<,>,!=,<>,<=,>=,in,not,in,is,is not),布尔(and, or, not)。

    • 如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格。有时需要通过自己来判断;但是,不要使用一个以上的空格,并且在二元运算符的两边使用相同数量的空格。

    • 在制定关键字参数或者默认参数值的时候,不要在=附近加上空格。

    • 功能型注释应该使用冒号的一般性规则,并且在使用->的时候要在两边加空格。

     # √
     i = i + 1
     submitted += 1
     x = x*2 - 1
     hypot2 = x*x + y*y
     c = (a+b) * (a-b)
     
     def complex(real, imag=0.0):
         return magic(r=real, i=imag)
     
     # ×
     def complex(real, imag = 0.0):
         return magic(r = real, i = imag)

    注释

    • 若注释很短,结尾的句号可以省略。块注释一般由完整句子的一个或多个段落组成,且每句话结束有个句号。

    • 在句尾结束的时候应该使用两个空格。

    • 块注释通常适用于跟随它们的某些(或全部)代码,并缩进到与代码相同的级别。

    • 有节制地使用行内注释。行内注释是与代码语句同行的注释。行内注释和代码至少要有两个空格分隔。注释由#和一个空格开始。

    • 多行文档说明使用的结尾三引号应该自成一行。

       """Return a foobang
       
       Optional plotz says to frobnicate the bizbaz first.
       """
    • 对于单行的文档说明,尾部的三引号应该和文档在同一行。

    命名约定

    • 类名首字母大写

    • 函数名应小写,若想提高可读性,可用下划线分隔

    • 始终要将 self 作为实例方法的的第一个参数

    • 始终要将 cls 作为类静态方法的第一个参数

    • 如果函数的参数名和已有的关键词冲突,在最后加单一下划线比缩写或随意拼写更好。因此 class_ 比 clss 更好。(也许最好用同义词来避免这种冲突)

    • 使用下划线分隔小写单词以提高可读性

    • 常量通常定义在模块级,通过下划线分隔的全大写字母命名。例如: MAX_OVERFLOW 和 TOTAL

    公共和内部的接口

    • 模块应该使用__all__属性显式地在它们的公共API中声明名称。将__all__设置为空列表表示模块没有公共API。

    • 即使通过__all__设置过,内部接口(包,模块,类,方法,属性或其他名字)依然需要单个下划线前缀。

    编程建议

    • 和像None这样的单例对象进行比较的时候应该始终用 is 或者 is not,永远不要用等号运算符

    • 始终使用def表达式,而不是通过赋值语句将lambda表达式绑定到一个变量上

       # √
       def f(x): return 2*x
       
       # ×
       f = lambda x: 2*x
    • 返回的语句保持一致。函数中的返回语句都应该返回一个表达式,或者都不返回。如果一个返回语句需要返回一个表达式,那么在没有值可以返回的情况下,需要用 return None 显式指明,并且在函数的最后显式指定一条返回语句(如果能跑到那的话)。

       # √
       def foo(x):
           if x >= 0:
               return math.sqrt(x)
           else:
               return None
       
       def bar(x):
           if x < 0:
               return None
           return math.sqrt(x)
       
       # ×
       def foo(x):
           if x >= 0:
               return math.sqrt(x)
       
       def bar(x):
           if x < 0:
               return
           return math.sqrt(x)
    • 使用字符串方法代替字符串模块

    • 使用 ”.startswith() 和 ”.endswith() 代替通过字符串切割的方法去检查前缀和后缀

    • 对象类型的比较应该用isinstance()而不是直接比较type

       正确: if isinstance(obj, int):
       
       糟糕: if type(obj) is type(1):
    • 不要用 == 去和True或者False比较

       正确: if greeting:
       糟糕: if greeting == True:
       更糟: if greeting is True:
    •  

  • 相关阅读:
    BP神经网络基本原理
    天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空乏其身,行拂乱其所为,所以动心忍性,增益其所不能
    LSH算法原理
    数据库索引的作用和长处缺点
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    Linux makefile 教程 很具体,且易懂
    银行家算法
    HDU 1757 A Simple Math Problem(矩阵高速幂)
    js中substr与substring的差别
    BackTrack5 (BT5)无线password破解教程之WPA/WPA2-PSK型无线password破解
  • 原文地址:https://www.cnblogs.com/wonker/p/13301487.html
Copyright © 2011-2022 走看看