日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django代码编写规范

發布時間:2025/3/11 编程问答 12 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 順序

  • 標準庫
  • 第三方庫
  • 項目本身
  • 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/
    • https://www.python.org/dev/peps/pep-0020/
    • http://docs.translatehouse.org/projects/pootle/en/stable-2.5.1/developers/styleguide.html

    ?

    ?

    禁止使用如下寫法,在代碼中重新設置編碼方式:

    ? 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 順序

  • 標準庫
  • 第三方庫
  • 項目本身
  • 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代码编写规范的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。