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 的編碼設置:
禁止使用如下寫法,在代碼中重新設置編碼方式:
這種設置方式會導致兩個問題:
1.2 字符串的編碼格式 在 Python 中有三種 string 類型:
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 字符編碼。
<type 'unicode'> 字節存儲的 str ,必須加前綴 b。例如下面這個例子,由于設置了?unicode_literals, 代碼中字符串默認采用 unicode 編碼,而?strftime?函數接受的是一個二進制字符串。這時,就需要顯示的聲明?%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 包含三個工具:
靜態檢查 Python 代碼邏輯錯誤的工具。
靜態檢查 PEP8 編碼風格的工具。
靜態分析 Python 代碼復雜度的工具。 安裝方式:
使用:
flake8 會對代碼是否有邏輯錯誤、是否符合 PEP8 規范、代碼復雜度進行檢測。更重要的是,flake8 會給出詳細的提示信息,具體到行和列,并給出修改意見。 3. 包引入 3.1 import 順序 3.2 import 格式
3.3 isort isort 是一個 Python 實用工具/庫,用于按字母順序對導入進行排序,并自動分割為各個部分。 它為各種編輯器提供了一個命令行 實用工具,Python 庫和插件,可以快速地對所有導入進行排序。 它目前干凈地支持 Python 2.7 - 3.6,但沒有任何依賴關系。 安裝:
使用:
4. models 內部定義順序
這里需要說明的是在 Django admin 中顯示一個對象的名字,Python 2 上是使用?__unicode__(),而在 Python 3 上是使用?__str__()。為了兼容兩種寫法,可以使用?python_2_unicode_compatible?裝飾器。
5. Python 之禪 Python 哲學的最好闡述,莫過于核心開發者 Tim Peters 所總結的 Python 之禪
6. 代碼提交注釋
7. 參考
? | ? |
禁止使用如下寫法,在代碼中重新設置編碼方式:
| ? | 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('測試') |
字節存儲的 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 順序
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/
- https://www.python.org/dev/peps/pep-0020/
- http://docs.translatehouse.org/projects/pootle/en/stable-2.5.1/developers/styleguide.html
總結
以上是生活随笔為你收集整理的Django代码编写规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最邻近插值、双线性插值、三次卷积插值最通
- 下一篇: CentOS7搭建部署Ambari 2.