编码规范

  • 编码

    • 如无特殊情况, 文件一律使用 UTF-8 编码
    • 如无特殊情况, 文件头部必须加入 #--coding:utf-8-- 标识
  • 缩进

    • 统一使用 4 个空格进行缩进
  • 引号

    • 自然语言 使用双引号 "...",例如错误信息;很多情况还是 unicode,使用u"你好世界"
    • 机器标识 使用单引号 '...' 例如 dict 里的 key,例如 dict 里的 key
    • 正则表达式 使用原生的双引号 r"..."
    • 文档字符串 (docstring) 使用三个双引号 """......"""
  • 空行

    • 模块级函数和类定义之间空两行
    • 类成员函数之间空一行
    • 可以使用多个空行分隔多组相关的函数
    • 函数中可以使用空行分隔出逻辑相关的代码
  1. class A:
  2. def __init__(self):
  3. pass
  4. def hello(self):
  5. pass
  6. def main():
  7. pass
  • Import 语句

    • import 语句应该分行书写
    • import语句应该使用 absolute import
    • import语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前
    • import语句应该按照顺序排列,每组之间用一个空行分隔
    • 导入其他模块的类定义时,可以使用相对导入
    • 如果发生命名冲突,则可使用命名空间
  1. # 正确的写法
  2. import os
  3. import sys
  4. # 不推荐的写法
  5. import sys,os
  6. # 正确的写法
  7. from subprocess import Popen, PIPE
  1. # 正确的写法
  2. from foo.bar import Bar
  3. # 不推荐的写法
  4. from ..bar import Bar
  1. import os
  2. import sys
  3. import msgpack
  4. import zmq
  5. import foo
  1. from myclass import MyClass
  1. import bar
  2. import foo.bar
  3. bar.Bar()
  4. foo.bar.Bar()
  • 空格

    • 在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]
    • 函数的参数列表中,,之后要有空格
    • 函数的参数列表中,默认值等号两边不要添加空格
    • 左括号之后,右括号之前不要加多余的空格
    • 字典对象的左括号之前不要多余的空格
    • 不要为对齐赋值语句而使用的额外空格
  1. # 正确的写法
  2. i = i + 1
  3. submitted += 1
  4. x = x * 2 - 1
  5. hypot2 = x * x + y * y
  6. c = (a + b) * (a - b)
  7. # 不推荐的写法
  8. i=i+1
  9. submitted +=1
  10. x = x*2 - 1
  11. hypot2 = x*x + y*y
  12. c = (a+b) * (a-b)
  1. # 正确的写法
  2. def complex(real, imag):
  3. pass
  4. # 不推荐的写法
  5. def complex(real,imag):
  6. pass
  1. # 正确的写法
  2. def complex(real, imag=0.0):
  3. pass
  4. # 不推荐的写法
  5. def complex(real, imag = 0.0):
  6. pass
  1. # 正确的写法
  2. spam(ham[1], {eggs: 2})
  3. # 不推荐的写法
  4. spam( ham[1], { eggs : 2 } )
  1. # 正确的写法
  2. dict['key'] = list[index]
  3. # 不推荐的写法
  4. dict ['key'] = list [index]
  1. # 正确的写法
  2. x = 1
  3. y = 2
  4. long_variable = 3
  5. # 不推荐的写法
  6. x = 1
  7. y = 2
  8. long_variable = 3
  • 换行

Python 支持括号内的换行。这时有两种情况

  1. 第二行缩进到括号的起始处
  1. foo = long_function_name(var_one, var_two,
  2. var_three, var_four)
  1. 第二行缩进 4 个空格,适用于起始括号就换行的情形
  1. def long_function_name(
  2. var_one, var_two, var_three,
  3. var_four):
  4. print(var_one)

使用反斜杠\换行,二元运算符+ .等应出现在行末;长字符串也可以用此法换行

  1. session.query(MyTable).\
  2. filter_by(id=1).\
  3. one()
  4. print 'Hello, '\
  5. '%s %s!' %\
  6. ('Harry', 'Potter')

禁止复合语句,即一行中包含多个语句:

  1. # 正确的写法
  2. do_first()
  3. do_second()
  4. do_third()
  5. # 不推荐的写法
  6. do_first();do_second();do_third();

if/for/while一定要换行

  1. # 正确的写法
  2. if foo == 'blah':
  3. do_blah_thing()
  4. # 不推荐的写法
  5. if foo == 'blah': do_blash_thing()
  • docstring

docstring 的规范中最其本的两点:

  • 所有的公共模块、函数、类、方法,都应该写 docstring 。私有方法不一定需要,但应该在 def 后提供一个块注释来说明。
  • docstring 的结束"""应该独占一行,除非此 docstring 只有一行。
  1. """Return a foobar
  2. Optional plotz says to frobnicate the bizbaz first.
  3. """
  4. """Oneline docstring"""

注释

块注释

  1. # 块注释
  2. # 块注释
  3. #
  4. # 块注释
  5. # 块注释

行注释

  1. # 正确的写法
  2. x = x + 1 # 边框加粗一个像素
  3. # 不推荐的写法(无意义的注释)
  4. x = x + 1 # x加1

建议

  • 在代码的关键部分(或比较复杂的地方), 能写注释的要尽量写注释
  • 比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性
  1. app = create_app(name, options)
  2. # =====================================
  3. # 请勿在此处添加 get post等app路由行为 !!!
  4. # =====================================
  5. if __name__ == '__main__':
  6. app.run()

文档注释(Docstring)

作为文档的Docstring一般出现在模块头部、函数和类的头部,这样在python中可以通过对象的__doc__对象获取文档. 编辑器和IDE也可以根据Docstring给出自动提示.

文档注释以 """ 开头和结尾, 首行不换行, 如有多行, 末行必需换行, 以下是Google的docstring风格示例

  1. # -*- coding: utf-8 -*-
  2. """Example docstrings.
  3. This module demonstrates documentation as specified by the `Google Python
  4. Style Guide`_. Docstrings may extend over multiple lines. Sections are created
  5. with a section header and a colon followed by a block of indented text.
  6. Example:
  7. Examples can be given using either the ``Example`` or ``Examples``
  8. sections. Sections support any reStructuredText formatting, including
  9. literal blocks::
  10. $ python example_google.py
  11. Section breaks are created by resuming unindented text. Section breaks
  12. are also implicitly created anytime a new section starts.
  13. """

不要在文档注释复制函数定义原型, 而是具体描述其具体内容, 解释具体参数和返回值等

  1. # 不推荐的写法(不要写函数原型等废话)
  2. def function(a, b):
  3. """function(a, b) -> list"""
  4. ... ...
  5. # 正确的写法
  6. def function(a, b):
  7. """计算并返回a到b范围内数据的平均值"""
  8. ... ...

对函数参数、返回值等的说明采用numpy标准, 如下所示

  1. def func(arg1, arg2):
  2. """在这里写函数的一句话总结(如: 计算平均值).
  3. 这里是具体描述.
  4. 参数
  5. ----------
  6. arg1 : int
  7. arg1的具体描述
  8. arg2 : int
  9. arg2的具体描述
  10. 返回值
  11. -------
  12. int
  13. 返回值的具体描述
  14. 参看
  15. --------
  16. otherfunc : 其它关联函数等...
  17. 示例
  18. --------
  19. 示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行
  20. >>> a=[1,2,3]
  21. >>> print [x + 3 for x in a]
  22. [4, 5, 6]
  23. """

文档注释不限于中英文, 但不要中英文混用

文档注释不是越长越好, 通常一两句话能把情况说清楚即可

模块、公有类、公有方法, 能写文档注释的, 应该尽量写文档注释

命名规范

模块

模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)

  1. # 正确的模块名
  2. import decoder
  3. import html_parser
  4. # 不推荐的模块名
  5. import Decoder

类名

类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头

  1. class Farm():
  2. pass
  3. class AnimalFarm(Farm):
  4. pass
  5. class _PrivateFarm(Farm):
  6. pass

将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要限制一个类一个模块.

函数

函数名一律小写,如有多个单词,用下划线隔开

  1. def run():
  2. pass
  3. def run_with_env():
  4. pass

私有函数在函数前加一个下划线_

  1. class Person():
  2. def _private_func():
  3. pass

变量名

变量名尽量小写, 如有多个单词,用下划线隔开

  1. if __name__ == '__main__':
  2. count = 0
  3. school_name = ''

常量

常量采用全大写,如有多个单词,使用下划线隔开

  1. MAX_CLIENT = 100
  2. MAX_CONNECTION = 1000
  3. CONNECTION_TIMEOUT = 600
  4. MAX_OVERFLOW = 100
  5. Class FooBar:
  6. def foo_bar(self, print_):
  7. print(print_)

相关参考

草根学Python

Python3 系列之 编程规范篇的更多相关文章

  1. Python3 系列之 基础语法篇

    基础数据类型 整数 python 可以处理任意大小的整数 浮点数 python 可以处理任意大小的浮点数,但是需要注意的一点是:整数运算永远是精确的(除法也是精确的),而浮点数运算则可能会有四舍五入的 ...

  2. Python3 系列之 环境配置篇

    以下所有操作是基于 Windows10 和 Python3.6 来进行的,其它平台和 python 版本请自行百度. 高效使用 Visual Studio Code 系列 环境安装 1.Python ...

  3. .Net程序员学用Oracle系列(3):数据库编程规范

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.书写规范 1.1.大小写风格 1.2.缩进风格 1.3.换行 1.4.其它 2.命名规范 2.1.数据库对象命名 2.2.变 ...

  4. linux shell语言编程规范安全篇之通用原则【转】

    shell语言编程规范安全篇是针对bash语言编程中的数据校验.加密与解密.脚本执行.目录&文件操作等方面,描述可能导致安全漏洞或风险的常见编码错误.该规范基于业界最佳实践,并总结了公司内部的 ...

  5. 【HANA系列】【第二篇】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列][第二篇]SAP HANA XS ...

  6. [C/C++]编程规范一:头文件篇

    一般来说,每一个.cc或者.cpp文件对应一个头文件(.h文件),当然,也有例外,例如一些测试单元或者main文件,头文件的一些规范可以令代码可读性.程序的性能等大为改观,所以还是要注意头文件的规范问 ...

  7. Batsing的网页编程规范(HTML/CSS/JS/PHP)

    特别注意!!!我这里的前端编程规范不苟同于Bootstrap的前端规范. 因为我和它的目的不同,Bootstrap规范是极简主义,甚至有些没有考虑到兼容性的问题. 我的规范是自己从编程实践中总结出来的 ...

  8. 使Eclipse符合Java编程规范

    编程规范是很重要的东西,能让团队的代码易于阅读和维护,也便于日后的功能扩展. 工欲善其事必先利其器!作为一个Java程序员,与Eclipse打交道可能是一辈子的事情.将Eclipse设置为符合公司编程 ...

  9. ASP.NET 5系列教程(七)完结篇-解读代码

    在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...

随机推荐

  1. (转)web前端知识精简

    Web前端技术由 html.css 和 javascript 三大部分构成,是一个庞大而复杂的技术体系,其复杂程度不低于任何一门后端语言.而我们在学习它的时候往往是先从某一个点切入,然后不断地接触和学 ...

  2. Android Studio中的大量findViewById

    一. 分析 在Android Studio中开发时,findViewById是用的最多的函数之一.经常需要对返回的view进行类型转换,输入麻烦.代码丑陋. 本文提供两种方案来解决这个问题: 1.安装 ...

  3. shell 命令 if elif else fi 用法

    #! /bin/bash if Iam; then echo "it worked two" else ls echo "I am in the else" f ...

  4. [转]kaldi上的深度神经网络

    转:http://blog.csdn.net/wbgxx333/article/details/41019453 深度神经网络已经是语音识别领域最热的话题了.从2010年开始,许多关于深度神经网络的文 ...

  5. linux(centos7)安装docker

    1.检查内核版本,必须是3.10及以上 uname ‐r 2.安装docker yum install docker 3.输入y确认安装 4.启动docker [root@localhost ~]# ...

  6. Swift5 语言指南(四) 基础知识

    Swift是iOS,macOS,watchOS和tvOS应用程序开发的新编程语言.尽管如此,Swift的许多部分对您在C和Objective-C中的开发经验都很熟悉. 雨燕提供了自己的所有基本C和Ob ...

  7. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置

    仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...

  8. python实现归并排序算法

    归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,效率为O(nlogn). 1945年由约翰·冯·诺伊曼首次提出.该算法是采用分治法(Divide ...

  9. python中stack在实际中的简单应用之进制转换

    计算机的世界是二进制的,而人类的世界是十进制的,当数学公式用计算机表达时,经常 要转换.这就用到了进制的转换. 首先,我们先了解一下二进制和十进制的发展历史: 二进制: 现代的二进制首先由大数学家莱布 ...

  10. 使用node.js如何爬取网站数据

    数据库又不会弄,只能扒扒别人的数据了. 搭建环境: (1).创建一个文件夹,进入并初始化一个package.json文件.  npm init -y (2).安装相关依赖:  npm install ...