從網上找到django中python的命名規範python
Python 規範django
代碼的佈局編輯器
編碼函數
全部的Python腳本文件都應在文件頭標上「# -*- coding:utf-8 -*-」。佈局
縮進測試
4個空格一個縮進層次 字體
空行ui
適當的空行有利於增長代碼的可讀性,加空行能夠參考以下幾個準則:this
(1) 在類、函數的定義間加空行;編碼
(2) 在import不一樣種類的模塊間加工行;
(3) 在函數中的邏輯段落間加空行,即把相關的代碼緊湊寫在一塊兒,做爲一個邏輯段落,段落間以空行分隔
換行
語句比較長,一行寫不下的狀況下使用
命名約定
有許多不一樣的命名風格。如下的有助於辨認正在使用的命名風格,獨立於它們的做用。 如下的命名風格是衆所周知的:
b (單個小寫字母)
B (單個大寫字母)
Lowercase(小寫)
lower_case_with_underscores(有下劃線的小寫)
UPPERCASE(大寫)
UPPER_CASE_WITH_UNDERSCORES(有下劃線的大寫)
應避免的名字。永遠不要用字符‘l’(小寫字母el(就是讀音,下同)),‘O’(大寫字母oh),或‘I’(大寫字母eye)做爲單字符的變量名。在某些字體中這些字符不能與數字1和0分辨。試着在使用‘l’時用‘L’代替。
常量
常量名全部字母大寫,由下劃線鏈接各個單詞,如:
WHITE = 0XFFFFFF
THIS_IS_A_CONSTANT = 1
變量
變量名所有小寫,由下劃線鏈接各個單詞,如:
color = WHITE
this_is_a_variable = 1
不管是類成員變量仍是全局變量,均不使用 m 或 g 前綴。私有類成員使用單一下劃線前綴標識,多定義公開成員,少定義私有成員。
變量名不該帶有類型信息,由於 Python 是動態類型語言。如 iValue、names_list、dict_obj 等都是很差的命名。
全局變量名
這些約定和在函數中的同樣。模塊是被設計爲經過「from M import *」來使用的,必須用一個下劃線做全局變量(及內部函數和類)的前綴防止其被導出(exporting)。
函數
函數名的命名規則與變量名相同。
類
類名單詞首字母大寫,不使用下劃線鏈接單詞,也不加入 C、T 等前綴。如:
class ThisIsAClass(object):
passs
模塊
模塊名所有小寫,對於包內使用的模塊,能夠加一個下劃線前綴,如:
module.py
_internal_module.py
包
包的命名規範與模塊相同。
縮寫
命名應當儘可能使用全拼寫的單詞,縮寫的狀況有以下兩種:
1 命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式,如去除元音、包含輔音的首字符等方式,例如:
function 縮寫爲 fn
text 縮寫爲 txt
object 縮寫爲 obj
count 縮寫爲 cnt
number 縮寫爲 num,等。
特定命名方式,主要是指 __xxx__ 形式的系統保留字命名法。項目中也可使用這種命名,它的意義在於這種形式的變量是隻讀的,這種形式的類成員函數儘可能不要重載。
異常名
若是模塊對全部狀況定義了單個異常,它一般被叫作「error」或「Error」。彷佛內建(擴展)的模塊使用「error」(例如:os.error),而Python模塊一般用「Error」 (例如:xdrlib.Error)。趨勢彷佛是傾向使用CapWords異常名
語句
import
import 語句有如下幾個原則須要遵照:
(1)import 的次序,先 import Python 內置模塊,再 import 第三方模塊,最後 import 本身開發的項目中的其它模塊;這幾種模塊中用空行分隔開來。
(2) 一條 import 語句 import 一個模塊。
(3)當從模塊中 import 多個對象且超過一行時,使用以下斷行法
from module import (obj1, obj2, obj3, obj4,
obj5, obj6)
(4)不要使用 from module import *,除非是 import 常量定義模塊或其它你確保不會出現命名空間衝突的模塊。
2 分枝和循環
對於分枝和循環,有以下幾點須要注意的:
不要寫成一行,如:
If !flg: pass 和 for i in xrange(10): print i都不是好代碼,應寫成
if !flg:
pass
for i in xrange(10):
print i
其它建議
始終在這些二元運算符兩邊放置一個空格:賦值(=), 比較(==,<,>,!=,<>,<=, >=,in,not in,is,is not),布爾運算 (and,or,not)。
按你的見解在算術運算符周圍插入空格。 始終保持二元運算符兩邊空格的一致。
一些例子:
#!Python
i = i+1
submitted = submitted + 1
x = x*2 - 1
hypot2 = x*x + y*y
c = (a+b) * (a-b)
c = (a + b) * (a - b)
不要在用於指定關鍵字參數或默認參數值的'='號周圍使用空格,例如:
#!Python
def complex(real, imag=0。0):
return magic(r=real, i=imag)
註釋
以#號開頭
同代碼不一致的註釋比沒註釋更差。當代碼修改時,始終優先更新註釋!註釋應該是完整的句子,若是註釋是一個短語或句子,首字母應該大寫,除非他是一個以小寫字母開頭的標識符(永遠不要修改標識符的大小寫)。
若是註釋很短,最好省略末尾的句號。
註釋塊
註釋塊一般應用於跟隨着一些(或者所有)代碼並和這些代碼有着相同的縮進層次。註釋塊中每行以‘#’和一個空格開始(除非他是註釋內的縮進文本)。註釋塊內的段落以僅含單個‘#’的行分割。註釋塊上下方最好有一空行包圍(或上方兩行下方一行,對一個新函數定義段的註釋)。
# url(r'^mysite/', include('mysite.foo.urls')),
# Uncomment the admin/doc line below to enable admin documentation:
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
行內註釋
一個行內註釋是和語句在同一行的註釋,行內註釋應該謹慎適用,行內註釋應該至少用兩個空格和語句分開,它們應該以'#'和單個空格開始。
x = x+1 # Increment x
若是語意是很明瞭的,那麼行內註釋是沒必要要的,事實上是應該被移除的。不要這樣寫:
x = x+1 # Increment x
x = x+1 # Compensate for border
可是有時,這樣是有益的:
x = x+1 # Compensate for border
繼承的設計
始終要肯定一個類中的方法和實例變量是否要被公開。一般,永遠不要將數據變量公開,除非你實現的本質上只是記錄,人們幾乎老是更喜歡代之給出一個函數做爲類的界面(Python 2.2 的一些開發者在這點上作得很是漂亮)。
一樣,肯定你的屬性是否應爲私有的。私有和非私有的區別在於模板將永遠不會對原有的類(導出類)有效,然後者能夠。你應該在大腦中就用繼承設計好了你的類,私有屬性必須有兩個前導下劃線,無後置下劃線,非公有屬性必須有一個前導下劃線,無後置下劃線,公共屬性沒有前導和後置下劃線,除非它們與保留字衝突,在此狀況下,單個後置下劃線比前置或混亂的拼寫要好,例如:class_優於klass。
最後一點有些爭議:若是相比class_你更喜歡klass,那麼這只是一致性問題。
設計建議
單個元素(singletons)的比較,如None 應該永遠用:‘is’或‘is not’來作。當你本意是「if x is not None」時,對寫成「if x」要當心。例如當你測試一個默認爲None的變量或參數是否被設置爲其它值時,這個值也許在布爾上下文(Boolean context)中是false!
基於類的異常老是好過基於字符串的異常。模塊和包應該定義它們本身的域內特定的基異常類,基類應該是內建的Exception類的子類。還始終包含一個類的文檔字符串。例如:
#!Python
class MessageError(Exception):
"""Base class for errors in the email package。"""
使用字符串方法(methods)代替字符串模塊,除非必須向後兼容Python 2.0之前的版本。字符串方法老是很是快,並且和unicode字符串共用一樣的API(應用程序接口)在檢查前綴或後綴時避免對字符串進行切片。用startswith()和endswith()代替,由於它們是明確的而且錯誤更少。例如:
No: if foo[:3] == 'bar':
Yes: if foo。startswith('bar'):
例外是若是你的代碼必須工做在Python 1.5.2 (可是咱們但願它不會發生!),對象類型的比較應該始終用isinstance()代替直接比較類型,例如:
No: if type(obj) is type(1):
Yes: if isinstance(obj, int):
檢查一個對象是不是字符串時,緊記它也多是unicode字符串!在Python 2.3,str和unicode有公共的基類,basestring,因此你能夠這樣作:
if isinstance(obj, basestring):
在Python 2.2類型模塊爲此定義了StringTypes類型,例如:
#!Python
from types import StringTypes
if isinstance(obj, StringTypes):
在Python 2.0和2.1,你應該這樣作:
#!Python
from types import StringType, UnicodeType
if isinstance(obj, StringType) or \
isinstance(obj, UnicodeType) :
對序列,(字符串,列表,元組),使用空列表是false這個事實,所以「if not seq」或「if seq」比「if len(seq)」或「if not len(seq)」好。書寫字符串文字時不要依賴於有意義的後置空格。這種後置空格在視覺上是不可辨別的,而且有些編輯器(特別是近來,reindent.py)會將它們修整掉。不要用==來比較布爾型的值以肯定是True或False(布爾型是Pythn 2.3中新增的)
No: if greeting == True:
Yes: if greeting:
No: if greeting == True:
Yes: if greeting:
Django 使用規範
(1) 模版規則:
在模版中,大括號裏的關鍵詞先後應該插入空格
如:{{ foo }}
而不是:{{foo}}
(2) 視圖的規則:
在視圖中,第一個參數應該寫成request
如:def my_view (request , foo):
#…………………………
而不是:
def my_view (foo ,request):
#…………………………
Model 規範
(1) 裏邊的字段名應該小寫,可使用下劃線:
如:
class Person(models.Model):
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=40)
而不是:
class Person(models.Model):
Frst_name = models.CharField(max_length=20)
LAST = models.CharField(max_length=40)
(2)兩個class之間用空白行隔開
(3)model 內的classes 和 methods 應該採起如下的順序(這些方法並非全部的class都要定義):
全部的數據項的field
自定義的manager 屬性
class Meta:
def __unicode__() :
def save()
def get_absolute_url()
其餘自定義的methods
若是給一個model field定義了可選擇項,那麼請將選擇項定義爲元組(內含不少元組--選擇項),將選擇項元組名稱定義爲所有大寫,定義放在model的頂部 或者就在model 的上面。
例如,性別選擇項GENDER_CHOICES這個名字爲所有大寫:
GENDER_CHOICES = (
('M', 'Male'),
('F', 'Female'),
)
django.conf.settings規範:
(1) settings.py中要使用相對路徑: