.
总则
Python开发规
概况:Python风格规 ,包含了部分Google风格规和PEP8规。包括Django项目目录结构的一些规,为适应我们实际需求,提高开发中代码更加可观性、易读性拟定的规。
第一章 命名规
1.1模块
模块尽量使用小写命名,首字母保持小写,尽量不要用下划线(除非多个单词,且数量不多的情况)
# 正确的模块名 import decoder import html_parser # 不推荐的模块名 import Decoder
Word 文档
.
1.2类名
类名使用驼峰(CamelCase)命名风格,首字母大写,私有类可用一个下划线开头 class Farm():
pass
class AnimalFarm(Farm):
pass
class _PrivateFarm(Farm):
pass
将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要一个类一个模块.
函数名一律小写,如有多个单词,用下划线隔开 def run(): pass def run_with_env(): pass 私有函数在函数前加一个下划线_ class Person(): def _private_func(): pass 1.3函数
编写函数的几个原则
函数设计要尽量短小,嵌套层次不宜过深;
函数申明应做到合理、简单、易于使用,函数名应能正确反映函数大体功能,参数设计应简洁明了,参数个数不宜过多;
函数参数设计应考虑向下兼容;
一个函数只做一件事,尽量保证函数语句粒度的一致性;
Word 文档
.
1.4变量名
避免只用大小写来区分不同的对象;
避免使用容易引起混淆的名称,变量名应与所解决的问题域一致;
变量名尽量小写, 如有多个单词,用下划线隔开 if __name__ == '__main__': count = 0 school_name = '' 常量采用全大写,如有多个单词,使用下划线隔开 MAX_CLIENT = 100 MAX_CONNECTION = 1000 CONNECTION_TIMEOUT = 600 不要害怕过长的变量名;
常量使用以下划线分隔的大写命名 MAX_OVERFLOW = 100 Class FooBar: def foo_bar(self, print_): print(print_) 1.5常量
1.6其他规则
1.所谓”部(Internal)”表示仅模块可用, 或者, 在类是保护或私有的. 2.用单下划线(_)开头表示模块变量或函数是protected的(使用import * from
Word 文档
.
时不会包含).
3.用双下划线(__)开头的实例变量或方法表示类私有.
4.将相关的类和顶级函数放在同一个模块里. 不像Java, 没必要一个类一个模块.
5.对类名使用大写字母开头的单词(如CapWords, 即Pascal风格), 但是模块名应该用小写加下划线的方式(如lower_with_under.py).
1.7应该避免的名称
1.单字符名称
2.包/模块名中使用连字符(-)而不使用下划线(_) 3.双下划线开头并结尾的名称(如__init__)
第二章 简明概述
2.1编码
如无特殊情况, 文件一律使用 UTF-8 编码
如无特殊情况, 文件头部必须加入#--coding:utf-8--标识
2.2代码格式
2.2.1、缩进 统一使用 4 个空格进行缩进
2.2.2、行宽 每行代码尽量不超过 80 个字符(在特殊情况下可以略微超过
80 ,但最长不得超过 120)
Word 文档
.
2.2.3不要使用反斜杠连接行
2.2.4 Python会将 圆括号, 中括号和花括号中的行隐式的连接起来 , 你可以
利用这个特点. 如果需要, 你可以在表达式外围增加一对额外的圆括号.
2.2.5对于行连接的情况, 你应该要么垂直对齐换行的元素, 或者使用4空格的悬挂式缩进(这时第一行不应该有参数):
理由:
这在查看 side-by-side 的 diff 时很有帮助 方便在控制台下查看代码 太长可能是设计有缺陷
2.3引号
简单说,自然语言使用双引号,机器标示使用单引号,因此 代码里 多数应该使用 单引号 自然语言 使用双引号 “…”
例如错误信息;很多情况还是 unicode,使用u”你好世界” 机器标识 使用单引号 ‘…’ 例如 dict 里的 key
正则表达式 使用原生的双引号 r”…”
Word 文档
.
文档字符串 (docstring) 使用三个双引号 “”“……”“”
2.4空行
模块级函数和类定义之间空两行;
class A: def __init__(self): pass def hello(self): pass def main(): pass ``` 可以使用多个空行分隔多组相关的函数 函数中可以使用空行分隔出逻辑相关的代码 类成员函数之间空一行;
Word 文档
.
正确的写法 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 2.5空格
Word 文档
.
1. 括号不要有空格
2. 不要在逗号,分号,冒号前面加空格,而应该在它们的后面加 3. 二元操作符两边都要加上一个空格(=, ==,<, >, !=, in, not ...) 4. 当’=’用于指示关键字参数或默认参数值时
5. 不要用空格来垂直对齐多行间的标记, 因为这会成为维护的负担(适用于:, #, =等)
2.6换行
第三章 注释规
3.1文档字符串
Python使用文档字符串作为注释方式: 文档字符串是包, 模块, 类或函数里的第一个语句. 这些字符串可以通过对象的doc成员被自动提取, 并且被pydoc所用. 我们对文档字符串的惯例是使用三重双引号”“”( PEP-257 ).
一个文档字符串应该这样组织:
1. 首先是一行以句号, 问号或惊叹号结尾的概述(或者该文档字符串单纯只有一行). 接着是一个空行.
2. 接着是文档字符串剩下的部分, 它应该与文档字符串的第一行的第一个引号对齐.
Word 文档
.
3.2行注释(PEP8)
行注释是与代码语句同行的注释 1. 行注释和代码至少要有两个空格分隔 2. 注释由#和一个空格开始,如下:
x = x + 1 # Compensate for border 3.3模块注释
每个文件应该最好包含一个许可样板. 根据项目使用的许可(例如, Apache 2.0, BSD, LGPL, GPL), 选择合适的样板.
# -*- coding: utf-8 -*- # (C) Zoneyet, Inc. 2018-2019 # All rights reserved # Licensed under Simplified BSD License (see LICENSE) 3.4函数和方法
一个函数必须要有文档字符串, 除非它满足以下条件: 1. 外部不可见 2. 非常短小
Word 文档
.
3. 简单明了
文档字符串应该包含函数做什么, 以及输入和输出的详细描述
文档字符串应该提供足够的信息, 当别人编写代码调用该函数时, 他不需要看一行代码, 只要看文档字符串就可以了
对于复杂的代码, 在代码旁边加注释会比使用文档字符串更有意义.
3.5类
类应该在其定义下有一个用于描述该类的文档字符串. 如果你的类有公共属性(Attributes), 那么文档中应该有一个属性(Attributes)段. 并且应该遵守和函数参数相同的格式.
1.1、块注释 “#”号后空一格,段落件用空行分开(同样需要“#”号) # 块注释 # 块注释 # # 块注释 # 块注释 1.2、行注释 至少使用两个空格和语句分开,注意不要使用无意义的注释 # 正确的写法 x = x + 1 # 边框加粗一个像素 3.6块注释和行注释
不推荐的注释
Word 文档
.
# 不推荐的写法(无意义的注释) x = x + 1 # x加1 1.3、建议 在代码的关键部分(或比较复杂的地方), 能写注释的要尽量写注释 比较重要的注释段, 使用多个等号隔开, 可以更加醒目, 突出重要性 app = create_app(name, options) # ===================================== # 请勿在此处添加 get post等app路由行为 # ===================================== if __name__ == '__main__': app.run()
3.7 TODO注释
1.TODO注释应该在所有开头处包含”TODO”字符串, 紧跟着是用括号括起来的你的名字, email地址或其它标识符. 然后是一个可选的冒号. 接着必须有一行注释, 解释要做什么
2.如果你的TODO是”将来做某事”的形式, 那么请确保你包含了一个指定的日期(“2009年11月解决”)或者一个特定的事件
第四章 其他规
Word 文档
.
4.1模块导入
1. 每个导入应该独占一行 2. 模块导入顺序
1标注库导入
2第三方库导入
3应用程序指定导入
3. 每种分组中, 应该根据每个模块的完整包路径按字典序排序, 忽略大小写.
正确的写法 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 Word 文档 .
如果发生命名冲突,则可使用命名空间 import bar import foo.bar
4.2二元运算符换行(PEP8)
# 推荐:运算符和操作数很容易进行匹配 income = (gross_wages + taxable_interest + (dividends - qualified_dividends) - ira_deduction - student_loan_interest) 4.3其它规
1.不要在行尾加分号, 也不要用分号将两条命令放在同一行.
Word 文档
.
2.除非是用于实现行连接, 否则不要在返回语句或条件语句中使用括号. 不过在元组两边使用括号是可以的. 3.顶级定义之间空两行, 方法定义之间空一行 4.4Pandas使用规
1. 2.
pandas数据结构命名 df_、se_
df取一列,禁止使用df.列名,可以使用df['列名'], 建议使用df.loc[:, '列名']
3. 禁止使用df.ix
第五章 Django开发规
Django 采用的是MTV开发模式 Model(模型):数据库相关的操作(ORM)
Template(模版):模板语法--->将变量(数据库数据)如何巧妙嵌入html页面中
View(视图):逻辑处理
此外,Django还有一个urls分发器:路径与视图函数的映射关系
Word 文档
.
5.1Django目录结构
上图zoneyet=app,webDjango表示project
每个业务模块可以自建一个model和与之对应的view model目录下主要处理数据
model下每个model对应写一个model的Manager业务逻辑方法 一般原则上每个model对应一个表,对应一个Manager业务处理。 view调用Manager方法实现,最终通过模板或者接口实现功能。
5.2标准化Django模板(Template)区块 (block) 名称
为了尽量标准化 Django 模板区块 (block) 名称, 我建议通常情况下使用以下区块名称.
Word 文档
.
{% block title %}
这个区块用来定义页面的标题. 你的 base.html 模板很可能要在这个 tag 之外定义 站点名字 (Site's name) (即便使用了 Sites 框架), 以便能够放在所有页面中.
{% block extra_head %}
我认为这是个非常有用的区块, 很多人已经以某种方式在使用了. 很多页面经常需要在 HTML 文档头添加些信息, 比如 RSS 源, Javascript, CSS, 以及别的应该放在文档头的信息. 你可以, 也很可能将会, 定义另外专门的区块 (比如前面的 title 区块) 来添加文档头的其它部分的信息.
{% block body %}
这个 tag 用来包含页面的整个 body 部分. 这使得你在 app 中创建的页面 能够替换整个页面容, 不仅仅是正文容. 这种做法虽不常见, 但当你需要时, 它确实是一个非常方便的 tag. 你可能还没注意到, 我一直尽可能的使 tag 名字和 HTML 标签名称保持一致.
{% block menu %}
你的菜单 (导航栏) 应该包含在这个区块中. 它是针对站点级的导航, 不是 每个页面专属的导航菜单.
{% block content %}
Word 文档
.
这个区块用来放置页面正文容. 任何页面正文容都可能不一样. 它不 包含任何站点导航, 信息头, 页脚, 或其它任何属于 base 模板的东东. 其它可能的区块
{% block content_title %}
用来指定 content 区块的 \"title\". 比如 blog 的标题. 也可以用来 包含 content 的导航 (译注: 比如提纲), 或其它类似的东东. 大致都是些 页面中并非主要容的东东. 我不知道这个区块是否应该放到 content tag , 并且对应于前面建议的 content tag, 是不是还需要一个 main_content 区块.
{% block header %} {% block footer %}
任何每个页面都可能修改的文本区域的页面和页脚.
{% block body_id %} {% block body_class %}
用来设置 HTML 文档 body 标签的 class 或 id 属性. 在设置样式或其它属性时 非常有用.
{% block [section]_menu %} {% block page_menu %}
这是对应于之前建议的 menu 区块. 用来导航一个章节或页面.
Word 文档
.
第六章 附则
第一条 本管理规定自发布之日起执行,由410838107负责解释。 第二条 修订记录
日期 2019/04/23 版本 1.0 状态 创建 修订摘要
Word 文档