在学习了python相关技术之后,开始重视其开发规范,以满足代码的可读性以及可维护性。主要的是学习了PEP8-style for python code的相关内容。

  1.  代码布局

    •  缩进:每一级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) #错误示例: # 使用垂直缩进时,第一行不能带有参数
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) #注意:4空格在连续换行中为可选项
# 悬挂缩进中可以不适用4空格一级的规则。
foo = long_function_name(
var_one, var_two,
var_three, var_four)
#首尾不写参数
my_list = [
1, 2, 3,
4, 5, 6,
]
result = some_function_that_takes_arguments(
'a', 'b', 'c',
'd', 'e', 'f',
)
    • Tab还是空格:python2中可以混合使用,python3强制只允许一种。
    • 最大长度:79个字符,docstrings/comments则应少于 72字符,用"/"连接两行:
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())
    • 操作符尽可能靠近下一个操作数
#错误示例
income = (gross_wages +
taxable_interest +
(dividends - qualified_dividends) -
ira_deduction -
student_loan_interest)
#正确示例
income = (gross_wages
+ taxable_interest
+ (dividends - qualified_dividends)
- ira_deduction
- student_loan_interest)
    • 空行:用两个空行包裹顶级函数或类,类中的方法定义被一个空白行包围。函数间尽量少的使用空白行(如果是一组逻辑则省略),函数内的逻辑也应尽可能少的使用空白行,除非为了显示更有逻辑性
    • python3源文件修改应为UTF-8编码,定义标准库必须使用ASCII且内容必须使用英文
    • 单独import必须分两行,from import可以在一行中引入,IMPORT必须在文件头使用,在module comment 和docstrings之后,在模块全局变量或实例之前
 #Yes:
import os
import sys
#No:
import sys, os
#YES
from subprocess import Popen, PIPE
'''模块的引入顺序应该为:
  1 标准库
  2 第三方库
  3 本地应用或库
在每个类别之间应该添加空白行'''
    • 提倡绝对导入,但如果绝对导入比较冗长可相对导入,python3中不鼓励,会出现未知bug
import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example #相对导入
from . import sibling
from .sibling import example
    • 通配符导入from <module> import *应尽可能避免
    • 模块级命名应该在docstring之后,任何声明之前(__future__除外)
"""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
    • 单双引号没有强制规定,但整个程序应该只使用一种规则,在docstring中应该使用三个双引号“”“
  •  表达式和语句中的空格
    • 以下几种情况不要使用空格

      • #括号紧跟的前后
        Yes: spam(ham[1], {eggs: 2})
        No: spam( ham[ 1 ], { eggs: 2 } )
        #逗号加反括号
        Yes: foo = (0,)
        No: bar = (0, )
        #逗号,分号,冒号前
        Yes: if x == 4: print x, y; x, y = y, x
        No: if x == 4 : print x , y ; x , y = y , x
        #切片中的特殊情况:如果有表达式,应保证冒号左右对称(数字不加空格)

        Yes:

        ham[1:9], ham[1:9:3], ham[:9:3], ham[1::3], ham[1:9:]
        ham[lower:upper], ham[lower:upper:], ham[lower::step]
        ham[lower+offset : upper+offset]
        ham[: upper_fn(x) : step_fn(x)], ham[:: step_fn(x)]
        ham[lower + offset : upper + offset]

        No:

        ham[lower + offset:upper + offset]
        ham[1: 9], ham[1 :9], ham[1:9 :3]
        ham[lower : : upper]
        ham[ : upper]
        #函数或变量的左括号,索引或切片均不加空格
        Yes: spam(1)
        No: spam (1)
        Yes: dct['key'] = lst[index]
        No: dct ['key'] = lst [index]
        #等号两边各加一个空格,不可为了对其而多加

        Yes:

        x = 1
        y = 2
        long_variable = 3

        No:

        x             = 1
        y = 2
        long_variable = 3

        #这些运算符左右各加一个空格:assignment (=), augmented assignment (+=, -= etc.), comparisons (==, <, >, !=, <>, <=, >=, in, not in, is, is not), Booleans (and, or, not).保证左右对称

        Yes:

        i = i + 1
        submitted += 1
        x = x*2 - 1
        hypot2 = x*x + y*y
        c = (a+b) * (a-b)

        No:

        i=i+1
        submitted +=1
        x = x * 2 - 1
        hypot2 = x * x + y * y
        c = (a + b) * (a - b)

        #关键字或默认赋值时的等号不添加空格:

        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:

        def munge(input: AnyStr): ...
        def munge() -> AnyStr: ...

        No:

        def munge(input:AnyStr = None): ...
        def munge()->PosInt: ...
        #混合声明一般不被允许,while,if除外

        Yes:

        if foo == 'blah':
        do_blah_thing()
        do_one()
        do_two()
        do_three()

        Rather not:

        if foo == 'blah': do_blah_thing()
        do_one(); do_two(); do_three()
        
        
        
        
    • 什么时候使用,)
      • #便于版本控制
        Yes: FILES = [
        'setup.cfg',
        'tox.ini',
        ]
        initialize(FILES,
        error=True,
        ) No: FILES = ['setup.cfg', 'tox.ini',]
        initialize(FILES, error=True,)
        #除了单元素元组是强制的以外,其他的都是为了更好的可读性
    • 注释
      •  鼓励使用多行注释,如果是单行,首字母应该大写(中文应该没有这个问题,而且变量的小写在首字母时应保持小写性质)
      •  单行注释无需句号,在使用句号后应该用两个空格隔开
    • 注释块(block comments):#后加空格
    • 注释行(line comments):跟程序至少间隔2个空格,且应该#加一个空格开始
    • 文档描述:
      • 应包括:公共模块,函数,类以及方法,不应该包括私有模块,但是应该在def后加注释说明实现方式
      • 结尾的3引号“”“应该单独列一行(只有一行的除外)
  • 命名规范
    • 不要使用大写的i,小写的L,和大写的O单独命名
    • 满足ASCII规则下
    • 模块和包应该尽量短,且使用全小写方式,下划线的方式不提倡
    • 类命名应该首字母大写(内置类除外)
    • _co or _contra来区分正反意
    • 全局变量名:使用from M import *时,应在M中有__all__机制来阻止全局变量的导出
    • 函数名:全小写,下划线区分,一个下划线区分私有变量和私有方法
    • 函数和方法变量:在实例方法中永远使用self作为第一个参数,在类方法中永远使用cls做第一个参数
    • 如果Foo类中有一个__a的属性,Foo.__a是访问不到该属性的,(Foo.__Foo__a是可以访问到),双下划线应该仅仅被用于设计为子类的类的命名冲突中
    • 常量全大写:MAX_OVERFLOWTOTAL.
    • 继承:公共属性无下划线

python PEP8相关介绍的更多相关文章

  1. Python pep8代码规范

    title: Python pep8代码规范 tags: Python --- 介绍(Introduction) 官方文档:PEP 8 -- Style Guide for Python Code 很 ...

  2. Python 基于python操纵zookeeper介绍

    基于python操纵zookeeper介绍 by:授客  QQ:1033553122 测试环境 Win7 64位 Python 3.3.4 kazoo-2.6.1-py2.py3-none-any.w ...

  3. Python的简单介绍

    0. 前言 最近在从头梳理Python的相关知识,有助于以后更好地学习新知识.这篇博客,我简单介绍一下Python语言的有关内容. 1. Python介绍 Python的创始人为荷兰人吉多·范罗苏姆( ...

  4. 一 hadoop 相关介绍

    hadoop 相关介绍 hadoop的首页有下面这样一段介绍.对hadoop是什么这个问题,做了简要的回答. The Apache™ Hadoop® project develops open-sou ...

  5. Python内存相关

    Python内存相关 示例一: v1 = [1, 2, 3] v2 = [1, 2 ,3] v1 = 123 v2 = 123 v1 = "dogfa" v2 = "do ...

  6. python strip()函数 介绍

    python strip()函数 介绍,需要的朋友可以参考一下   函数原型 声明:s为字符串,rm为要删除的字符序列 s.strip(rm)        删除s字符串中开头.结尾处,位于 rm删除 ...

  7. ppDelegate的相关介绍

    //  AppDelegate的相关介绍//  IOS笔记 //@interface AppDelegate : UIResponder <UIApplicationDelegate>// ...

  8. 【个人笔记】002-PHP基础-01-PHP快速入门-02-PHP语言相关介绍输

    002-PHP基础-01-PHP快速入门 02-PHP语言相关介绍 1.PHP是什么 Hypertext Preprocessor超文本预处理器 是一种通用开源脚本语言 Personal Home P ...

  9. Android HttpClient HttpURLConnection相关介绍

    Android HttpClient HttpURLConnection相关介绍 遇到一个问题 在android studio上用HttpClient编写网络访问代码的时候,发现该类无法导入并使用.. ...

随机推荐

  1. Scrapy-简单介绍

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, 网络抓取 )所设计的, ...

  2. ajax上传图片chrome报错net::ERR_CONNECTION_RESET/net::ERR_CONNECTION_ABORTED

    网上搜了一下,base64图片太大,tomcat对post请求大小有默认限制,要在tomcat配置文件server.xml 加一个:maxPostSize="0",0表示无限制 & ...

  3. 动态规划算法的java实现

    一:动态规划 1)动态规划的向前处理法 java中没有指针,所以邻接表的存储需要转化一中形式,用数组存储邻接表 用三个数组u,v,w存储边,u数组代表起点,v数组代表终点,w代表权值;例如:1--&g ...

  4. AGC010 - A: Addition

    原题链接 题意简述 给出一个个数的数列,每次选出两个奇偶性相同的数合成一个数,问最终能否只剩下一个数. 分析 非常简单的一道题. 两个偶数可以合成一个偶数,两个奇数也能合成一个偶数.所以合并偶数时偶数 ...

  5. 【Learning】最小点覆盖(二分图匹配) 与Konig定理证明

    (附一道例题) Time Limit: 1000 ms   Memory Limit: 128 MB Description 最小点覆盖是指在二分图中,用最小的点集覆盖所有的边.当然,一个二分图的最小 ...

  6. 多key业务,数据库水平切分架构一次搞定

    数据库水平切分是一个很有意思的话题,不同业务类型,数据库水平切分的方法不同. 本篇将以"订单中心"为例,介绍"多key"类业务,随着数据量的逐步增大,数据库性能 ...

  7. java 集合框架(十四)Queue

    一.概述 Queue一种队列结构集合,用来存储将要进行处理的元素.通常以FIFO的方式排序元素,但这并不是必须的.比如优先度队列就是一个例外,它是以元素的值来排序.但无论怎样,每个Queue的实现都必 ...

  8. MFC下用sdl 显示bmp、rgb、yuv

    #include <libsdl/SDL.h>//#include "SDL.h"#ifdef TEST_VGA16 /* Define this if you wan ...

  9. Android HotFix动态加载框架介绍

    HotFix(Deprecated) https://github.com/dodola/HotFix 请关注 RocooFix 我重新写了一个RocooFix框架,解决了Nuwa因为Gradle1. ...

  10. IDirectDraw接口

    创建一个主DirectDraw对象,并使用QueryInterface()方法来得到最新的IDirectDraw7接口,或是直接用DirectDrawCreateEx()函数直接创建一个DirectD ...