Django代码编写规范

1. 编码声明

在 Python 解释器执行代码时,需要告诉解释器代码的编码方式。Python 代码实际上是文本数据,如果代码的编码方式与解释器读取的编码方式不一致,将会因编码错误,代码无法执行。Python 2 解释器读取代码时,默认的编码方式是 ASCII,而如果在代码中出现非 ASCII 码的字符时,就会报错。这时,就需要声明 Python 代码的编码方式。

1.1 设置解释器读取代码的编码格式

为了统一 Python 解释器读取代码的格式,建议在代码文件头部统一添加,utf-8 的编码设置:

1. 编码声明

在 Python 解释器执行代码时,需要告诉解释器代码的编码方式。Python 代码实际上是文本数据,如果代码的编码方式与解释器读取的编码方式不一致,将会因编码错误,代码无法执行。Python 2 解释器读取代码时,默认的编码方式是 ASCII,而如果在代码中出现非 ASCII 码的字符时,就会报错。这时,就需要声明 Python 代码的编码方式。

1.1 设置解释器读取代码的编码格式

为了统一 Python 解释器读取代码的格式,建议在代码文件头部统一添加,utf-8 的编码设置:

# coding:utf-8

禁止使用如下写法,在代码中重新设置编码方式:

import sys

reload(sys)

sys.setdefaultencoding('utf-8')

这种设置方式会导致两个问题:

  • 需要 ASCII 编码的字符参数无法传递
  • 中文作为字典的 key 值时,会出现诡异的程序行为,in 和 == 的比较行为不一致。

1.2 字符串的编码格式

在 Python 中有三种 string 类型:

  • unicode,text string,文本数据
  • str,byte string,二进制数据
  • basestring,是前两者的父类。

Python 2 中的字符串 ‘xxx’ 表示 str,u’xxx' 表示 unicode。Python 3 中,u’xxx' 和 ‘xxx’ 都表示 unicode。而 b’xxx' 在 Python 2 和 Python 3 中,均表示二进制数据。

在 Python 2 中, __future__ 提供了 unicode_literals 模块,将当前文件中所有的字符串转化为 unicode ,以兼容 Python 3 字符编码。

# coding:utf-8

from __future__ import unicode_literals

print type('测试')

<type 'unicode'>

字节存储的 str ,必须加前缀 b。例如下面这个例子,由于设置了 unicode_literals, 代码中字符串默认采用 unicode 编码,而 strftime 函数接受的是一个二进制字符串。这时,就需要显示的声明 %m月%d日 %H:%M 为二进制字符串;否则执行时,将会报错。

# coding:utf-8

from __future__ import unicode_literals

from datetime import datetime

print datetime.now().strftime(b'%m月%d日 %H:%M')

2. PEP8

2.1 命名

  • 模块名

尽量全小写,也可以使用下划线 module django_module

  • 全局变量\常量

全大写+下划线式驼峰 GLOBAL_VAR

  • 类名

首字母大写式驼峰 ClassName()

  • 函数命名

全小写+下划线驼峰 is_valid_data()

  • 局部变量

全小写+下划线式驼峰 this_is_var

2.2 flake 8

Flake8 是由 Python 官方发布的一款辅助检测Python 代码是否规范的工具。Flake8 包含三个工具:

  • PyFlakes

静态检查 Python 代码逻辑错误的工具。

  • Pep8

静态检查 PEP8 编码风格的工具。

  • NedBatchelder’s McCabe script

静态分析 Python 代码复杂度的工具。

安装方式:

pip install flake8

使用:

# 查看使用帮助文档

flake8 -h

# 检查某个文件

flake8 your.py

your.py:1:1: E265 block comment should start with '# '

# 检查当前目录

flake8 ./

flake8 会对代码是否有逻辑错误、是否符合 PEP8 规范、代码复杂度进行检测。更重要的是,flake8 会给出详细的提示信息,具体到行和列,并给出修改意见。

3. 包引入

3.1 import 顺序

  1. 标准库
  2. 第三方库
  3. 项目本身

3.2 import 格式

  • 单独一行
  • 使用绝对路径,Python 2 缺省为相对路径导入,Python 3 缺省为绝对路径导入,建议统一使用绝对路径。绝对路径导入可以避免导入子模块覆盖掉标准库模块。__future__ 中提供了 absolute_import 模块支持。
  • 使用 import x 来导入包和模块,不要使用 import *
  • 使用 from x import y , 其中x是包前缀, y是不带前缀的模块名.
  • 使用 from x import y as z, 如果两个要导入的模块都叫做y或者y太长了.

3.3 isort

isort 是一个 Python 实用工具/库,用于按字母顺序对导入进行排序,并自动分割为各个部分。 它为各种编辑器提供了一个命令行 实用工具,Python 库和插件,可以快速地对所有导入进行排序。 它目前干净地支持 Python 2.7 - 3.6,但没有任何依赖关系。

安装:

pip install isort

使用:

# 对单个文件中的导入排序

isort you.py

# 对整个目录进行导入排序

isort ./

4. models 内部定义顺序

  • 数据库字段
  • 非数据库字段
  • 默认 objects 管理器
  • 自定义管理器属性(即其他 managers)
  • class Meta
  • def natural_key() (因为它与模型紧密相关)
  • 所有 @cached_property 属性
  • 任何 @classmethod 装饰的方法
  • def __unicode__()
  • def __str__()
  • 任何以 __ 开头的方法(例如 __init__())
  • def save()
  • def delete()
  • def get_absolute_url()
  • def get_translate_url()
  • 任何自定义方法

这里需要说明的是在 Django admin 中显示一个对象的名字,Python 2 上是使用 __unicode__(),而在 Python 3 上是使用 __str__()。为了兼容两种写法,可以使用 python_2_unicode_compatible 装饰器。

from django.db import models

from django.utils.encoding import python_2_unicode_compatible

@python_2_unicode_compatible

class MyModel(models.Model):

# ...

def __str__(self): # __unicode__ on Python 2

return self.my_show_name

5. Python 之禅

Python 哲学的最好阐述,莫过于核心开发者 Tim Peters 所总结的 Python 之禅

import this

  • Python 以编写优美的代码为目标
  • 代码应当明了,命名规范,风格相似
  • 代码应当简洁,不要有复杂的内部实现
  • 如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁
  • 代码应当扁平,不能有太多的嵌套
  • 代码应适当的间隔,不要奢望一行代码解决问题
  • 代码应该具有良好的可读性
  • 即使有使用特例,也不要违背这些原则
  • 精准地捕获异常,不写 except: pass 风格的代码
  • 当存在多种可能,不要尝试去猜测
  • 如果不确定,就用穷举法
  • 你不是 Python 之父,有些问题解决不了
  • 动手写代码之前要思考清楚方案
  • 如果不能清楚地向他人描述实现,那么这肯定不是好的方案
  • 好好利用命名空间

6. 代码提交注释

bugfix : 线上功能 Bug 修复

sprintfix:未上线代码修改

minor:不重要的修改(换行,拼写错误等)

feature :新功能说明

improvement :已有功能优化

documentation :新增说明文档,比如 readme.md 文件

refactoring:代码重构

7. 参考

  • http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/
  • PEP 20 – The Zen of Python | peps.python.org
  • Styleguide — Pootle 2.5.1.3 documentation

禁止使用如下写法,在代码中重新设置编码方式:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

这种设置方式会导致两个问题:

  • 需要 ASCII 编码的字符参数无法传递
  • 中文作为字典的 key 值时,会出现诡异的程序行为,in 和 == 的比较行为不一致。

1.2 字符串的编码格式

在 Python 中有三种 string 类型:

  • unicode,text string,文本数据
  • str,byte string,二进制数据
  • basestring,是前两者的父类。

Python 2 中的字符串 ‘xxx’ 表示 str,u’xxx' 表示 unicode。Python 3 中,u’xxx' 和 ‘xxx’ 都表示 unicode。而 b’xxx' 在 Python 2 和 Python 3 中,均表示二进制数据。

在 Python 2 中, __future__ 提供了 unicode_literals 模块,将当前文件中所有的字符串转化为 unicode ,以兼容 Python 3 字符编码。

1
2
3
4
# coding:utf-8
from __future__ import unicode_literalsprint type('测试')
<type 'unicode'>

字节存储的 str ,必须加前缀 b。例如下面这个例子,由于设置了 unicode_literals, 代码中字符串默认采用 unicode 编码,而 strftime 函数接受的是一个二进制字符串。这时,就需要显示的声明 %m月%d日 %H:%M 为二进制字符串;否则执行时,将会报错。

1
2
3
4
5
6
# coding:utf-8
from __future__ import unicode_literalsfrom datetime import datetimeprint datetime.now().strftime(b'%m月%d日 %H:%M')

2. PEP8

2.1 命名

  • 模块名
    尽量全小写,也可以使用下划线 module django_module
  • 全局变量\常量
    全大写+下划线式驼峰 GLOBAL_VAR
  • 类名
    首字母大写式驼峰 ClassName()
  • 函数命名
    全小写+下划线驼峰 is_valid_data()
  • 局部变量
    全小写+下划线式驼峰 this_is_var

2.2 flake 8

Flake8 是由 Python 官方发布的一款辅助检测Python 代码是否规范的工具。Flake8 包含三个工具:

  • PyFlakes
    静态检查 Python 代码逻辑错误的工具。
  • Pep8
    静态检查 PEP8 编码风格的工具。
  • NedBatchelder’s McCabe script
    静态分析 Python 代码复杂度的工具。

安装方式:

1
pip install flake8

使用:

1
2
3
4
5
6
7
# 查看使用帮助文档
flake8 -h 
# 检查某个文件
flake8 your.py
your.py:1:1: E265 block comment should start with '# '
# 检查当前目录
flake8 ./

flake8 会对代码是否有逻辑错误、是否符合 PEP8 规范、代码复杂度进行检测。更重要的是,flake8 会给出详细的提示信息,具体到行和列,并给出修改意见。

3. 包引入

3.1 import 顺序

  1. 标准库
  2. 第三方库
  3. 项目本身

3.2 import 格式

  • 单独一行
  • 使用绝对路径,Python 2 缺省为相对路径导入,Python 3 缺省为绝对路径导入,建议统一使用绝对路径。绝对路径导入可以避免导入子模块覆盖掉标准库模块。__future__ 中提供了 absolute_import 模块支持。
  • 使用 import x 来导入包和模块,不要使用 import *
  • 使用 from x import y , 其中x是包前缀, y是不带前缀的模块名.
  • 使用 from x import y as z, 如果两个要导入的模块都叫做y或者y太长了.

3.3 isort

isort 是一个 Python 实用工具/库,用于按字母顺序对导入进行排序,并自动分割为各个部分。 它为各种编辑器提供了一个命令行 实用工具,Python 库和插件,可以快速地对所有导入进行排序。 它目前干净地支持 Python 2.7 - 3.6,但没有任何依赖关系。

安装:

1
pip install isort

使用:

1
2
3
4
# 对单个文件中的导入排序
isort you.py
# 对整个目录进行导入排序
isort ./

4. models 内部定义顺序

  • 数据库字段
  • 非数据库字段
  • 默认 objects 管理器
  • 自定义管理器属性(即其他 managers
  • class Meta
  • def natural_key() (因为它与模型紧密相关)
  • 所有 @cached_property 属性
  • 任何 @classmethod 装饰的方法
  • def __unicode__()
  • def __str__()
  • 任何以 __ 开头的方法(例如 __init__()
  • def save()
  • def delete()
  • def get_absolute_url()
  • def get_translate_url()
  • 任何自定义方法

这里需要说明的是在 Django admin 中显示一个对象的名字,Python 2 上是使用 __unicode__(),而在 Python 3 上是使用 __str__()。为了兼容两种写法,可以使用 python_2_unicode_compatible 装饰器。

1
2
3
4
5
6
7
8
from django.db import models
from django.utils.encoding import python_2_unicode_compatible@python_2_unicode_compatible
class MyModel(models.Model):
# ...def __str__(self):              # __unicode__ on Python 2return self.my_show_name

5. Python 之禅

Python 哲学的最好阐述,莫过于核心开发者 Tim Peters 所总结的 Python 之禅

1
import this
  • Python 以编写优美的代码为目标
  • 代码应当明了,命名规范,风格相似
  • 代码应当简洁,不要有复杂的内部实现
  • 如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁
  • 代码应当扁平,不能有太多的嵌套
  • 代码应适当的间隔,不要奢望一行代码解决问题
  • 代码应该具有良好的可读性
  • 即使有使用特例,也不要违背这些原则
  • 精准地捕获异常,不写 except: pass 风格的代码
  • 当存在多种可能,不要尝试去猜测
  • 如果不确定,就用穷举法
  • 你不是 Python 之父,有些问题解决不了
  • 动手写代码之前要思考清楚方案
  • 如果不能清楚地向他人描述实现,那么这肯定不是好的方案
  • 好好利用命名空间

6. 代码提交注释

1
2
3
4
5
6
7
bugfix : 线上功能 Bug 修复
sprintfix:未上线代码修改
minor:不重要的修改(换行,拼写错误等)
feature :新功能说明
improvement :已有功能优化
documentation :新增说明文档,比如 readme.md 文件
refactoring:代码重构

7. 参考

  • http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/
  • PEP 20 – The Zen of Python | peps.python.org
  • Styleguide — Pootle 2.5.1.3 documentation

任何程序错误,以及技术疑问或需要解答的,请添加

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Get sdcard directory by adb

解决方案&#xff1a; adb shell echo $EXTERNAL_STORAGE I am making an application, which pulls files(Saved by android app) from the device sdcard by adb. The problem is that different devices, have various sdcard directories i.e: sdcardsdcard/external_sdFi…

VueJs开发笔记—IDE选择和优化、框架特性、数据调用、路由选项及使用

一、IDE的选择&#xff1a; VsCode和WebStorm都是不错的选择&#xff0c;说一下两者的优缺点&#xff0c;调试便捷性来说两者不相上下. WebStorm缺点&#xff1a;性能方面VsCode远好于WebStorm&#xff1b; WebStorm优点&#xff1a;代码引用追踪Ws有VsCode无&#xff0c;控制台…

MFC新建文件夹、打开文件夹的实现方法

一、 MFC新建文件夹到指定路径的实现方法 典例&#xff1a; 二、 MFC保存文件到指定路径的实现方法 典例&#xff1a; 三、 MFC打开指定路径的文件夹的实现方法 典例&#xff1a; 注意&#xff1a;ShellExecute函数还可以打开指定路径的普通文件或者可执行文件。

VueJs生产环境部署

VueJs为客户端语言&#xff0c;所以部署的时候是不需要基于nodejs或其他服务器运行环境&#xff0c;只需要像其他静态站点的方式发布就可以了&#xff0c;下面介绍一下VueJs具体发布的流程还有需要注意的点。 先来看VueJs最终生成的文件目录&#xff1a; 具体的步骤如下&#x…

a20隐藏底部按钮及隐藏状态栏和虚拟按键栏

2019独角兽企业重金招聘Python工程师标准>>> 隐藏RecentButton按钮&#xff1a; 在源码android4.2/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tablet/TabletStatusBar.java的makeStatusBarView()方法中添加&#xff08;这是全志androi…

如何计算一个网段的子网掩码,网络ID,广播地址和可用IP地址数

1.判断两个IP在不在一个网段&#xff0c;主要看这两个IP的网络ID&#xff0c;如果网络ID相同则这两个IP在同一网段 示例&#xff1a;判断192.168.0.11/26 和 192.168.0.111/26在不在同一网段 首先计算两个IP的网络ID&#xff1a; 192.168.0.11/26 子网掩码&#xff08;2进…

WebApi开启CORS支持跨域POST

概念&#xff1a;CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff0c;发出XMLHttpRequest请求&#xff0c;从而克服了AJAX只能同源使用的限制。 现象&#xff1a;如请…

MFC中CString类字符串与长整型、浮点型、字符数组char数据之间的相互转换

一、长整型数据与CString类字符串相互转换 1.将长整型数据转换为CString字符串类 CString str; long ld; str.Format(_T("%ld"),ld); 2.将CString字符串类转换为长整型数据 CString str; long ld; ld_wtol(str); _wtol()在<stdlib.h> and <wchar.h>…

SSH2 后端编程思路总结

课程快结束了&#xff0c;那我就总结一下利用SSH2框架设计网站后端的思路吧。网站的后端设计大部分操作都是数据的存取&#xff0c;那么就总结一下Strut2中后端操作以及几点要注意的事项吧。后端操作&#xff1a;后端的操作基本上都是在Model、Action以及Service中完成的&#…

如何给APP开发属于自己的小程序

前言 工欲善其事&#xff0c;必先利其器。 首先&#xff0c;我们需要知道微信小程序是什么&#xff1f;微信小程序内核是什么&#xff1f;微信小程序的开发语言什么&#xff1f;这样才能更好的开发微信小程序&#xff0c;以及解决遇到的问题。 一、微信小程序是什么 微信小程…

Xamarin开发笔记—WebView双项事件调用

1.Xamarin调用WebView&#xff1a; 原理&#xff1a;Xamarin.Forms WebView内置方法xx.Eval(..)可以调用到页面里面的js函数。 WebView展示的代码如下&#xff1a; var htmlSource new HtmlWebViewSource();htmlSource.Html "<html><head><meta charse…

数据仓库入门(实验10)在Excel中查询层次结构

一、连接到SSAS二、导入数据三、选择数值、行标签、列标签1. 选择数值2. 选择行标签3. 选择列标签四、过滤五、完成转载于:https://blog.51cto.com/jimshu/1339522

MFC中CString类字符串用法小结

一、 赋值运算 二、 比较运算 注意&#xff1a;如果s1小于s2;则z等于-1&#xff1b;如果s1大于s2;则z等于1&#xff1b;如果s1等于s2;则z等于0&#xff1b; 三、 删除函数 四、 插入函数 五、 计算字符总个数函数 更加详细内容参考VS2010 MSDN

设置 Google Analytics(分析)全局网站统计代码

设置 Google Analytics&#xff08;分析&#xff09;全局网站统计代码 本文包含的主题&#xff1a; 基本说明根据您的网站类型设置数据收集验证您的全局网站代码是否正常工作相关资源 基本说明 无论您要从哪些网站收集数据&#xff0c;如果您尚未为每个目标网站分别创建 Goog…

Xamarin开发笔记—百度在线语音合成

续《是时候开始用C#快速开发移动应用了》刷屏之后&#xff0c;把C#开发移动应用的技术 > Xamarin&#xff0c;在这里和大家做一个分享&#xff01; 语音合成&#xff1a;也被称为文本转换技术&#xff08;TTS&#xff09;&#xff0c;它是将计算机自己产生的、或外部输入的…

《Oracle comment on注释信息方法论》

更多精彩内容尽在leonarding.blog.51cto.com《Oracle comment on注释信息方法论》引言&#xff1a;在DBA日常工作中写注释信息可能会经常有&#xff0c;但用Oracle命令来写和使用我想应该不是很多&#xff0c;其实Oracle给我们提供了非常丰富的语言表述语法&#xff0c;而我们日…

利用MFC按钮使能(或禁用)属性使按钮变正常色(或灰色)

利用MFC按钮使能&#xff08;或禁用&#xff09;属性使按钮变正常色&#xff08;或灰色&#xff09; GetDlgItem(IDC_XXX)->EnableWindow(FALSE)//IDC_XXX为你想变灰的按钮的ID 利用你找到的handle&#xff0c;或者窗体&#xff08;按钮也是一个窗体&#xff09;指针&#…

js处理16进制hex转str出现的中文乱码问题

昨天從FB下載了一份包含所有對話紀錄的JSON檔&#xff0c;但裡面的中文字編碼有問題&#xff0c;通通變成下面這個樣子 "\u00e7\u0094\u009f\u00e6\u0097\u00a5"本來想說這種事情應該很簡單&#xff0c;就把他每個字元當成char轉存不就得了&#xff0c;結果轉出來的東…

CentOS 6.2 本地安装YUM

一般学习linux的同学都是先学习的Red hat吧&#xff0c;小编也是如此&#xff0c;但是在生产环境中&#xff0c;大多数企业用的是基于redhat 内核的 centos &#xff0c;小编最近在接触centos时&#xff0c;就发现了不少问题&#xff0c;今天先从本地YUM说起。 redhat配置本地Y…

MFC设置对话框背景色及控件颜色

MFC设置对话框背景色及控件颜色 一、使用背景图片更改对话框背景色 在对话框源文件void CxxDlg::OnPaint()函数中 if (IsIconic()) { (这里省略) } else { CDialogEx::OnPaint(); } else里面添加下列代码&#xff1a; 效果如下图所示&#xff1a; 二、使用颜色更改对话…