Python:代码规范和命名规范

机器视觉001 2020-11-13 02:49:36
代码 Python 规范 命名


Python:代码规范和命名规范

所有命名规范都要准守这三条:

1.命名只能以字母或者_下划线开头;

2.名字不能包含空格;

3.名字不能与关键字重合。不能将字符l(小写字母l),'O''o'(大小写字母o)、'I'(大写字母I)用作变量名称,防止和数字0、1混淆。

 

模块

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

# 正确的模块名
import decoder
import html_decoder
# 不推荐的模块名
import Decoder

 

类名

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

class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass

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

 

函数

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

def func():
pass
def func_with_env():
pass

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

class Person():
def _private_func():
pass

 

变量

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

私有类成员使用单一下划线前缀标识。

变量名不应该带有类型信息,如num_list,ani_dict等。

if __name__ == '__main__':
count = 0
your_name = ''

 

常量

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

MAX_CLIENT = 100
MAX_CONNECTION = 1000
CONNECTION_TIMEOUT = 600

异常 ExceptionName

以Error作为后缀:

try:
pass
except ValueError as result:
pass

前导后缀下划线说明

  • 一个前导下划线:表示非公有
  • 一个后缀下划线:避免关键字冲突
  • 两个前导下划线:当命名一个类属性引起名称冲突时使用
  • 两个前导和后缀下划线:有特殊用途的对象或者属性,例如__init____str__

 

编码

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

 

代码格式

缩进

统一使用 4 个空格进行缩进

行宽

每行代码尽量不超过 80 个字符(在特殊情况下可以略微超过 80 ,但最长不得超过 120)。

理由:

  • 这在查看 side-by-side 的 diff 时很有帮助
  • 方便在控制台下查看代码
  • 太长可能是设计有缺陷

引号

简单说,自然语言使用“双引号”,机器标示使用“单引号”,因此代码里多数应该使用“单引号”。

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

空行

  • 模块级函数和类定义之间空两行;
  • 类成员函数之间空一行;
  • 可以使用多个空行分隔多组相关的函数
  • 函数中可以使用空行分隔出逻辑相关的代码
class Class:
def __init__(self):
pass
def hello(self):
pass
def main():
pass 

 

import 语句

import 语句应该分行书写:

# 正确的写法
import os
import sys
# 不推荐的写法
import sys,os
# 正确的写法
from subprocess import Popen, PIPE

import语句应该使用 absolute import

# 正确的写法
from foo.bar import Bar
# 不推荐的写法
from ..bar import Bar
  • import语句应该放在文件头部,置于模块说明及docstring之后,于全局变量之前;
  • import语句应该按照顺序排列,每组之间用一个空行分隔
import os
import sys
import msgpack
import zmq
import foo

导入其他模块的类定义时,可以使用相对导入

from myclass import MyClass

如果发生命名冲突,则可使用命名空间

import bar
import foo.bar
bar.Bar()
foo.bar.Bar()

 

空格

在二元运算符两边各空一格[=,-,+=,==,>,in,is not, and]

# 正确的写法
i = i + 1
submitted += 1
x = x * 2 - 1
hypot2 = x * x + y * y
c = (a + b) * (a - b)
# 不推荐的写法
i=i+1
submitted +=1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)

函数的参数列表中,,之后要有空格:

# 正确的写法
def complex(real, imag):
pass
# 不推荐的写法
def complex(real,imag):
pass

函数的参数列表中,默认值等号两边不要添加空格:

# 正确的写法
def complex(real, imag=0.0):
pass
# 不推荐的写法
def complex(real, imag = 0.0):
pass

左括号之后,右括号之前不要加多余的空格:

# 正确的写法
spam(ham[1], {eggs: 2})
# 不推荐的写法
spam( ham[1], { eggs : 2 } )

字典对象的左括号之前不要多余的空格:

# 正确的写法
dict['key'] = list[index]
# 不推荐的写法
dict ['key'] = list [index]

不要为对齐赋值语句而使用的额外空格:

# 正确的写法
x = 1
y = 2
long_variable = 3
# 不推荐的写法
x = 1
y = 2
long_variable = 3

 

换行

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

1) 第二行缩进到括号的起始处:

foo = long_function_name(var_one, var_two,
var_three, var_four)

2) 第二行缩进 4 个空格,适用于起始括号就换行的情形:

def long_function_name(
var_one, var_two, var_three,
var_four):
print(var_one)

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

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

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

# 正确的写法
do_first()
do_second()
do_third()
# 不推荐的写法
do_first();do_second();do_third();

if/for/while一定要换行:

# 正确的写法
if foo == 'blah':
do_blah_thing()
# 不推荐的写法
if foo == 'blah': do_blash_thing()

 

docstring

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

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

注释

块注释

“#”号后空一格,段落件用空行分开(同样需要“#”号):

# 块注释
# 块注释
#
# 块注释
# 块注释

行注释

至少使用两个空格和语句分开,注意不要使用无意义的注释:

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

建议

  • 在代码的关键部分(或比较复杂的地方),能写注释的要尽量写注释;

  • 比较重要的注释段, 使用多个等号隔开,可以更加醒目,突出重要性。
app = create_app(name, options)
# =====================================
# 请勿在此处添加 get post等app路由行为 !!!
# =====================================
if __name__ == '__main__':
app.run()

文档注释(Docstring)

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

  • 文档注释以 """ 开头和结尾,首行不换行,如有多行,末行必需换行,以下是Google的docstring风格示例:
# -*- coding: utf-8 -*-
"""Example docstrings.
This module demonstrates documentation as specified by the `Google Python
Style Guide`_. Docstrings may extend over multiple lines. Sections are created
with a section header and a colon followed by a block of indented text.
Example:
Examples can be given using either the ``Example`` or ``Examples``
sections. Sections support any reStructuredText formatting, including
literal blocks::
$ python example_google.py
Section breaks are created by resuming unindented text. Section breaks
are also implicitly created anytime a new section starts.
"""

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

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

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

def func(arg1, arg2):
"""在这里写函数的一句话总结(如: 计算平均值).
这里是具体描述.
参数
----------
arg1 : int
arg1的具体描述
arg2 : int
arg2的具体描述
返回值
-------
int
返回值的具体描述
参看
--------
otherfunc : 其它关联函数等...
示例
--------
示例使用doctest格式, 在`>>>`后的代码可以被文档测试工具作为测试用例自动运行
>>> a=[1,2,3]
>>> print [x + 3 for x in a]
[4, 5, 6]
"""
  • 文档注释不限于中英文, 但不要中英文混用;

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

版权声明
本文为[机器视觉001]所创,转载请带上原文链接,感谢
https://blog.csdn.net/liubing8609/article/details/109460993

  1. 利用Python爬虫获取招聘网站职位信息
  2. Using Python crawler to obtain job information of recruitment website
  3. Several highly rated Python libraries arrow, jsonpath, psutil and tenacity are recommended
  4. Python装饰器
  5. Python实现LDAP认证
  6. Python decorator
  7. Implementing LDAP authentication with Python
  8. Vscode configures Python development environment!
  9. In Python, how dare you say you can't log module? ️
  10. 我收藏的有关Python的电子书和资料
  11. python 中 lambda的一些tips
  12. python中字典的一些tips
  13. python 用生成器生成斐波那契数列
  14. python脚本转pyc踩了个坑。。。
  15. My collection of e-books and materials about Python
  16. Some tips of lambda in Python
  17. Some tips of dictionary in Python
  18. Using Python generator to generate Fibonacci sequence
  19. The conversion of Python script to PyC stepped on a pit...
  20. Python游戏开发,pygame模块,Python实现扫雷小游戏
  21. Python game development, pyGame module, python implementation of minesweeping games
  22. Python实用工具,email模块,Python实现邮件远程控制自己电脑
  23. Python utility, email module, python realizes mail remote control of its own computer
  24. 毫无头绪的自学Python,你可能连门槛都摸不到!【最佳学习路线】
  25. Python读取二进制文件代码方法解析
  26. Python字典的实现原理
  27. Without a clue, you may not even touch the threshold【 Best learning route]
  28. Parsing method of Python reading binary file code
  29. Implementation principle of Python dictionary
  30. You must know the function of pandas to parse JSON data - JSON_ normalize()
  31. Python实用案例,私人定制,Python自动化生成爱豆专属2021日历
  32. Python practical case, private customization, python automatic generation of Adu exclusive 2021 calendar
  33. 《Python实例》震惊了,用Python这么简单实现了聊天系统的脏话,广告检测
  34. "Python instance" was shocked and realized the dirty words and advertisement detection of the chat system in Python
  35. Convolutional neural network processing sequence for Python deep learning
  36. Python data structure and algorithm (1) -- enum type enum
  37. 超全大厂算法岗百问百答(推荐系统/机器学习/深度学习/C++/Spark/python)
  38. 【Python进阶】你真的明白NumPy中的ndarray吗?
  39. All questions and answers for algorithm posts of super large factories (recommended system / machine learning / deep learning / C + + / spark / Python)
  40. [advanced Python] do you really understand ndarray in numpy?
  41. 【Python进阶】Python进阶专栏栏主自述:不忘初心,砥砺前行
  42. [advanced Python] Python advanced column main readme: never forget the original intention and forge ahead
  43. python垃圾回收和缓存管理
  44. java调用Python程序
  45. java调用Python程序
  46. Python常用函数有哪些?Python基础入门课程
  47. Python garbage collection and cache management
  48. Java calling Python program
  49. Java calling Python program
  50. What functions are commonly used in Python? Introduction to Python Basics
  51. Python basic knowledge
  52. Anaconda5.2 安装 Python 库(MySQLdb)的方法
  53. Python实现对脑电数据情绪分析
  54. Anaconda 5.2 method of installing Python Library (mysqldb)
  55. Python implements emotion analysis of EEG data
  56. Master some advanced usage of Python in 30 seconds, which makes others envy it
  57. python爬取百度图片并对图片做一系列处理
  58. Python crawls Baidu pictures and does a series of processing on them
  59. python链接mysql数据库
  60. Python link MySQL database