Pocoo 風格指引是全部 Pocoo 項目的風格指引,包括 Flask 。這份風格指引 在 Flask 補丁中是必須的,而且推薦在 Flask 擴展中使用。python
通常而言, Pocoo 風格指引遵循 PEP 8 ,有一些小差別和擴充。正則表達式
縮進:函數
4個空格。沒有製表符,沒有例外。佈局
最大行長:this
79字符,軟限制是 84 ,若是絕對必要。嘗試合理放置 break 、 continue 和 return聲明來避免代碼過分嵌套。編碼
可續長語句:spa
你可使用反斜線來繼續一個語句,在這種狀況下,你應該對齊下一行到最後一個 點或等號或縮進四個空格:scala
this_is_a_very_long(function_call, 'with many parameters') \ .that_returns_an_object_with_an_attribute MyModel.query.filter(MyModel.scalar > 120) \ .order_by(MyModel.name.desc()) \ .limit(10)
若是你在一個帶括號的語句中換行,對齊到括號:code
this_is_a_very_long(function_call, 'with many parameters', 23, 42, 'and even more')
對於有許多元素的元組或列表,在起始括號後當即換行:orm
items = [ 'this is the first', 'set of items', 'with more items', 'to come in this line', 'like this' ]
空行:
頂層函數和類由兩個空行分隔,其它的東西由一行。不要使用太多的空行來分隔 代碼中的邏輯段。例如:
def hello(name): print 'Hello %s!' % name def goodbye(name): print 'See you %s.' % name class MyClass(object): """This is a simple docstring""" def __init__(self, name): self.name = name def get_annoying_name(self): return self.name.upper() + '!!!!111'
常規空格規則:
-
、 ~
等等), 在圓括號內一樣好例子:
exp = -1.05 value = (item_value / item_count) * offset / exp value = my_list[index] value = my_dict['key']
糟糕的例子:
exp = - 1.05 value = ( item_value / item_count ) * offset / exp value = (item_value/item_count)*offset/exp value=( item_value/item_count ) * offset/exp value = my_list[ index ] value = my_dict ['key']
不能使用 Yoda 語句:
永遠不要用常量與變量作比較,而是把變量與常量作比較:
好例子:
if method == 'md5': pass
糟糕的例子:
if 'md5' == method: pass
比較:
==
和 !=
is
和 is not
(例如 foo is not None
)foo == False
,而是 notfoo
)否認包含檢查:
使用 foo not in bar
而不是 not foo in bar
實例檢查:
用 isinstance(a, C)
而不是 type(A) is C
, 但一般試圖避免 實例檢查,請對特性檢查。
CamelCase
,縮寫詞大寫 ( HTTPWriter
而非 HttpWriter
)lowercase_with_underscores
lowercase_with_underscores
UPPERCASE_WITH_UNDERSCORES
name_re
被保護的成員以單個下劃線做爲前綴,雙下劃線爲混合類保留。
在帶有關鍵字的類上,會添加結尾的下劃線。與內置構件衝突是容許的,而且 必定不要在用在變量名後添加下劃線的方式解決。若是函數須要訪問一個隱蔽 的內置構件,重綁定內置構件到一個不一樣的名字做爲替代。
函數和方法參數:
cls
做爲第一個參數self
做爲第一個參數x
,像 display_name =property(lambda x: x.real_name or x.username)
中同樣文檔字符串約定:
全部的文檔字符串爲 Sphinx 可理解的 reStructuredText 格式。它們的形態 因行數不一樣而迥異。若是隻有一行,閉合的三引號和開頭的三引號在同一行, 不然開頭的三引號與文本在同一行,而閉合的三引號另起一行:
def foo(): """This is a simple docstring""" def bar(): """This is a longer docstring with so much information in there that it spans three lines. In this case the closing triple quote is on its own line. """
模塊標頭:
模塊標頭包含一個 utf-8 編碼聲明(即便沒有使用非 ASCII 字符,也始終推 薦這麼作)和一個標準的文檔字符串:
# -*- coding: utf-8 -*- """ package.module ~~~~~~~~~~~~~~ A brief description goes here. :copyright: (c) YEAR by AUTHOR. :license: LICENSE_NAME, see LICENSE_FILE for more details. """
請留意什麼時候的版權和許可證文件對於經過審覈的 Flask 擴展是必須的。
註釋的規則和文檔字符串相似。二者都使用 reStructuredText 格式。若是一個 註釋被用於一個屬性的文檔,在起始的井號( #
)後加一個冒號:
class User(object): #: the name of the user as unicode string name = Column(String) #: the sha1 hash of the password + inline salt pw_hash = Column(String)