簡明 Python 編程規范

簡明 Python 編程規范
編碼
??? 所有的 Python 腳本文件都應在文件頭標上 # -*- coding:utf-8 -*- 。設置編輯器,默認保存為 utf-8 格式。
注釋
??? 業界普遍認同 Python 的注釋分為兩種的概念,一種是由 # 開頭的“真正的”注釋,另一種是 docstrings。前者表明為何選擇當前實現以及這種實現的原理和難點,后者表明如何使用這個包、模塊、類、函數(方法),甚至包括使用示例和單元測試。
??? 堅持適當注釋原則。對不存在技術難點的代碼堅持不注釋,對存在技術難點的代碼必須注釋。但與注釋不同,推薦對每一個包、模塊、類、函數(方法)寫 docstrings,除非代碼一目了然,非常簡單。
縮進
??? Python 依賴縮進來確定代碼塊的層次,行首空白符主要有兩種:tab 和空格,但嚴禁兩者混用。如果使用 tab 縮進,設定 tab 為 4 個空格。
??? 公司內部推薦使用 4 個空格的 tab 進行縮進。
空格
??? 空格在 Python 代碼中是有意義的,因為 Python 的語法依賴于縮進,在行首的空格稱為前導空格。在這一節不討論前導空格相關的內容,只討論非前導空格。非前導空格在 Python 代碼中沒有意義,但適當地加入非前導空格可以增進代碼的可讀性。
1) 在二元算術、邏輯運算符前后加空格:如 a = b + c;
2) 在一元前綴運算符后不加空格,如 if !flg: pass;
3) “:”用在行尾時前后皆不加空格,如分枝、循環、函數和類定義語言;用在非行尾時兩端加空格,如 dict 對象的定義 d = {‘key’ : ’value’}。
4) 括號(含圓括號、方括號和花括號)前后不加空格,如 do_something(arg1, arg2),而不是 do_something( arg1, arg2 );
5) 逗號后面加一個空格,前面不加空格;s
空行
??? 適當的空行有利于增加代碼的可讀性,加空行可以參考如下幾個準則:
1) 在類、函數的定義間加空行;
2) 在 import 不同種類的模塊間加工行;
3) 在函數中的邏輯段落間加空行,即把相關的代碼緊湊寫在一起,作為一個邏輯段落,段落間以空行分隔;
斷行
??? 盡管現在的寬屏顯示器已經可以單屏顯示超過 256 列字符,但本規范仍然堅持行的最大長度不得超過 78 個字符的標準。折疊長行的方法有以下幾種方法:
1) 為長變量名換一個短名,如:
??? this.is.a.very.long.variable_name = this.is.another.long.variable_name
??? 應改為:
??? variable_name1 = this.is.a.very.long.variable_name
??? variable_name2 = this.is.another.variable_name
??? variable_name1 = variable_name2s
2) 在括號(包括圓括號、方括號和花括號)內換行,如:
??? class Edit(CBase):
??????? def __init__(self, parent, width,
??????????????????????????????? font = FONT, color = BLACK, pos = POS, style = 0):
??? 或:
??? very_very_very_long_variable_name = Edit(parent, \
??????????????????????????????????????????????????????????????????????????? width, \
??????????????????????????????????????????????????????????????????????????? font, \
??????????????????????????????????????????????????????????????????????????? color, \
??????????????????????????????????????????????????????????????????????????? pos)
??? 如果行長到連第一個括號內的參數都放不下,則每個元素都單獨占一行:
??? very_very_very_long_variable_name = ui.widgets.Edit( \
??????????????????????????????????????????????????????????????????????????????????? panrent, \
??????????????????????????????????????????????????????????????????????????????????? width, \
??????????????????????????????????????????????????????????????????????????????????? font, \
??????????????????????????????????????????????????????????????????????????????????? color, \
??????????????????????????????????????????????????????????????????????????????????? pos)
3) 在長行加入續行符強行斷行,斷行的位置應在操作符前,且換行后多一個縮進,以使維護人員看代碼的時候看到代碼行首即可判定這里存在換行,如:
if color == WHITE or color == BLACK \
or color == BLUE: # 注意 or 操作符在新行的行首而不是舊行的行尾
do_something(color);
命名
??? 一致的命名可以給開發人員減少許多麻煩,而恰如其分的命名則可以大幅提高代碼的可讀性,降低維護成本。
常量
?常量名所有字母大寫,由下劃線連接各個單詞,如
WHITE = 0XFFFFFF
THIS_IS_A_CONSTANT = 1
變量
??? 變量名全部小寫,由下劃線連接各個單詞,如
color = WHITE
this_is_a_variable = 1
??? 不論是類成員變量還是全局變量,均不使用 m 或 g 前綴。私有類成員使用單一下劃線前綴標識,多定義公開成員,少定義私有成員。
??? 變量名不應帶有類型信息,因為 Python 是動態類型語言。如 iValue、names_list、dict_obj 等都是不好的命名。
函數
??? 函數名的命名規則與變量名相同。

??? 類名單詞首字母大寫,不使用下劃線連接單詞,也不加入 C、T 等前綴。如:
class ThisIsAClass(object):
??? passs
模塊
??? 模塊名全部小寫,對于包內使用的模塊,可以加一個下劃線前綴,如
module.py
_internal_module.py

??? 包的命名規范與模塊相同。
縮寫
??? 命名應當盡量使用全拼寫的單詞,縮寫的情況有如下兩種:
1) 常用的縮寫,如 XML、ID等,在命名時也應只大寫首字母,如
class XmlParser(object):pass
2) 命名中含有長單詞,對某個單詞進行縮寫。這時應使用約定成俗的縮寫方式,如去除元音、包含輔音的首字符等方式,例如:
function 縮寫為 fn
text 縮寫為 txt
object 縮寫為 obj
count 縮寫為 cnt
number 縮寫為 num,等。
特定命名方式
??? 主要是指 __xxx__ 形式的系統保留字命名法。項目中也可以使用這種命名,它的意義在于這種形式的變量是只讀的,這種形式的類成員函數盡量不要重載。如
class Base(object):
??? def __init__(self, id, parent = None):
??????? self.__id__ = id
??????? self.__parent__ = parent
??? def __message__(self, msgid):
??????? # …略
其中 __id__、__parent__ 和 __message__ 都采用了系統保留字命名法。
語句
import
??? import 語句有以下幾個原則需要遵守:
1) import 的次序,先 import Python 內置模塊,再 import 第三方模塊,最后 import 自己開發的項目中的其它模塊;這幾種模塊中用空行分隔開來。
2) 一條 import 語句 import 一個模塊。
3) 當從模塊中 import 多個對象且超過一行時,使用如下斷行法(此語法 py2.5 以上版本才支持):
from module import (obj1, obj2, obj3, obj4,
??????????????????????????????????? obj5, obj6)
4) 不要使用 from module import *,除非是 import 常量定義模塊或其它你確保不會出現命名空間沖突的模塊。
賦值
??? 對于賦值語言,主要是不要做無謂的對齊,如:
a?? = 1???? # 這是一個行注釋
variable? = 2???? # 另一個行注釋
fn?? = callback_function? # 還是行注釋
沒有必要做這種對齊,原因有兩點:一是這種對齊會打亂編程時的注意力,大腦要同時處理兩件事(編程和對齊);二是以后閱讀和維護都很困難,因為人眼的橫向視野很窄,把三個字段看成一行很困難,而且維護時要增加一個更長的變量名也會破壞對齊。直接這樣寫為佳:
a = 1 # 這是一個行注釋
variable = 2 # 另一個行注釋
fn = callback_function # 還是行注釋
分枝和循環
??? 對于分枝和循環,有如下幾點需要注意的:
1) 不要寫成一行,如:
if !flg: pass 和 for i in xrange(10): print i都不是好代碼,應寫成
if !flg:
??? pass
for i in xrange(10):
??? print i
注:本文檔中出現寫成一行的例子是因為排版的原因,不得作為編碼中不斷行的依據。
2) 條件表達式的編寫應該足夠 pythonic,如以下形式的條件表達式是拙劣的:
if len(alist) != 0: do_something()
if alist != []: do_something()
if s != “”: do_something()
if var != None: do_something()
if var != False: do_something()
上面的語句應該寫成:
if seq: do_somethin() # 注意,這里命名也更改了
if var: do_something()
3) 用得著的時候多使用循環語句的 else 分句,以簡化代碼。
已有代碼
??? 對于項目中已有的代碼,可能因為歷史遺留原因不符合本規范,應當看作可以容忍的特例,允許存在;但不應在新的代碼中延續舊的風格。
??? 對于第三方模塊,可能不符合本規范,也應看作可以容忍的特例,允許存在;但不應在新的代碼中使用第三方模塊的風格。
??? tab 與空格混用的縮進是不可容忍的,在運行項目時應使用 –t 或 –tt 選項排查這種可能性存在。出現混用的情況時,如果是公司開發的基礎類庫代碼,應當通知類庫維護人員修改;第三方模塊則可以通過提交 patch 等方式敦促開發者修正問題。
已有風格
??? 開發人員往往在加入項目之前已經形成自有的編碼風格,加入項目后應以本規范為準編寫代碼。特別是匈牙利命名法,因為帶有類型信息,并不適合 Python 編程,不應在 Python 項目中應用。


本文來自CSDN博客:http://blog.csdn.net/lanphaday/archive/2008/08/26/2834883.aspx

轉載于:https://www.cnblogs.com/nick4/articles/1587758.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/379525.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/379525.shtml
英文地址,請注明出處:http://en.pswp.cn/news/379525.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

進程虛擬地址管理

文章目錄1 地址分布實際使用中的內存區域2 進程的虛擬地址描述用戶空間mmap線程之間共享內存地址的實現機制1 地址分布 現在采用虛擬內存的操作系統通常都使用平坦地址空間,平坦地址空間是指地址空間范圍是一個獨立的連續空間(比如,地址從0擴…

java兩個文件夾比較路徑_比較Java中兩個文件的路徑

java兩個文件夾比較路徑Given the paths of the two files and we have two compare the paths of the files in Java. 給定兩個文件的路徑,我們有兩個比較Java中文件的路徑。 Comparing paths of two files 比較兩個文件的路徑 To compare the paths of two file…

標題:加法變乘法

標題:我們都知道:123 … 49 1225 現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015 比如: 123…10*1112…27*2829…49 2015 就是符合要求的答案。 請你尋找另外一個可能的答案,并把位置靠前的那個乘號左…

C# winform對話框用法大全收藏

對話框中我們常用了以下幾種: 1、文件對話框(FileDialog) 它又常用到兩個: 打開文件對話框(OpenFileDialog) 保存文件對話(SaveFileDialog) 2、字體對話框(FontDialog) 3、顏色對話框(ColorDialog) 4、打印預瀏對話框(PrintPreviewDialog) 5、…

【翻譯】eXpressAppFramework QuickStart 業務模型設計(四)—— 實現自定義業務類...

這一講,你將學到如何從頭開始實現業務類。為此,將要實現Department和Position業務類。這些類將被應用到之前實現的Contact類中。你將學到引用對象自動生成用戶界面的基本要素。 在此之前,我建議你去閱讀一下 【翻譯】eXpressAppFramework Qui…

內存重映射

文章目錄1 kmap2 映射內核內存到用戶空間使用remap_pfn_range使用io_remap_pfn_rangemmap文件操作建立VMA和實際物理地址的映射mmap 之前分配 一次性映射mmap 之前分配 Page FaultPage Fault 中分配 映射內核內存有時需要重新映射,無論是從內核到用戶空間還是從內…

math.sqrt 有問題_JavaScript中帶有示例的Math.sqrt()方法

math.sqrt 有問題JavaScript | Math.sqrt()方法 (JavaScript | Math.sqrt() Method) The Math.sqrt() method is inbuilt in JavaScript to find the square root of a number. In this tutorial, we will learn about the sqrt() method with examples. JavaScript中內置了Mat…

標題:移動距離

標題:移動距離 X星球居民小區的樓房全是一樣的,并且按矩陣樣式排列。其樓房的編號為1,2,3… 當排滿一行時,從下一行相鄰的樓往反方向排號。 比如:當小區排號寬度為6時,開始情形如下: 1 2 3 4 5 6 12 11 1…

ISAPI Rewrite 實現簡單url重寫、二級域名重寫

實現步驟: 第一步:下載ISAPI_Rewrite.rar,將Rewrite文件夾和httpd.ini直接放在項目根目錄下面。 第二步:IIS配置,篩選Rewrite文件夾里面的Rewrite.dll文件,如圖: 第三步:在httpd.ini…

用戶登錄

用戶登錄 代碼namespace 用戶登錄 {public partial class Form1 : Form{public Form1(){InitializeComponent();}bool b1, b2, b3, b4, b5, b6;private void button1_Click(object sender, EventArgs e){try{if (b1 && b2 && b3 && b4 && b5 &…

進程上下文和中斷上下文

文章目錄進程的preempt_count變量thread_infopreempt_counthardirq相關softirq相關上下文原文鏈接: https://zhuanlan.zhihu.com/p/88883239進程的preempt_count變量 thread_info 在內核中,上下文的設置和判斷接口可以參考 include/linux/preempt.h 文…

標題:湊算式

標題:湊算式 這個算式中AI代表19的數字,不同的字母代表不同的數字。 比如: 68/3952/714 就是一種解法, 53/1972/486 是另一種解法。 這個算式一共有多少種解法? 注意:你提交應該是個整數,不要…

匯編中imul_JavaScript中帶有示例的Math.imul()方法

匯編中imulJavaScript | Math.imul()方法 (JavaScript | Math.imul() Method) Math.imul() is a function in math library of JavaScript that is used to the 32-bit multiplication of the two values passed to it. It uses C-like semantics to find the multiplication. …

AFTER觸發器與INSTEAD OF觸發器的區別

INSTEAD OF 觸發器用來代替通常的觸發動作,即當對表進行INSERT、UPDATE 或 DELETE 操作時,系統不是直接對表執行這些操作,而是把操作內容交給觸發器,讓觸發器檢查所進行的操作是否正確。如正確才進行相應的操作。因此,…

Linux內存地址管理

文章目錄系統內存布局內核地址的低端和高端內存概念低端內存高端內存地址轉換和MMULinux中的四級分頁模型虛擬地址字段頁表處理將虛擬地址轉換物理地址Linux系統中的每個內存地址都是虛擬的,它們不直接指向任何物理內存地址。每當訪問內存位置時,可以執行…

錄制caf 轉 mp3

編譯需要使用的 lame庫http://www.cocoachina.com/bbs/read.php?tid108237參考的文章http://blog.csdn.net/ysy441088327/article/details/7392842說起來,我一直在找一個音頻轉換成mp3的方法。一年前,我成功編譯出了一個lame for armv7的庫。苦于不會使…

杭電2012-素數判定(C)

Problem Description 對于表達式n^2n41&#xff0c;當n在&#xff08;x,y&#xff09;范圍內取整數值時&#xff08;包括x,y&#xff09;(-39<x<y<50)&#xff0c;判定該表達式的值是否都為素數。 Input 輸入數據有多組&#xff0c;每組占一行&#xff0c;由兩個整數…

math.ceil帶小數點_JavaScript中帶有示例的Math.ceil()方法

math.ceil帶小數點JavaScript | Math.ceil()方法 (JavaScript | Math.ceil() Method) Math.ceil() is a function in math library of JavaScript that is used to round up the number passed to the function. The method will return the nearest integer value indeed is g…

開發記要 詭異的變量

告別繁體文盲,從寫blog開始 Variable命名很重要,有多重要,看看.net和java的加密就知道, 都是把variable改到一塌糊塗,你想看看都沒門. 但是這幾天看遺留系統的代碼,真是大開眼界。 我一直以為別人寫a,b,c,d這些單字節variable已經很過分。直到我看到以下這幾個&#xff0…

排序算法---快速排序、堆排序、冒泡排序

排序算法1 快速排序代碼實現stdlib庫快排2 堆排序堆排序的基本思想如何構造一個大頂堆排序3 冒泡排序1 快速排序 文章原地址&#xff1a;https://blog.csdn.net/morewindows/article/details/6684558 快速排序的平均時間復雜度是0(NlogN)&#xff0c;它采用了一種分治的策略&a…