no判斷 python yes_python 編碼規範
技術標籤:no判斷 python yes
以下為PEP 8 -- Style Guide for Python Code
一、Code lay-out 程式碼佈局
1.每級縮排使用 4 個空格。
2.絕不要混用製表符和空格。
3.最流行的 Python 縮排方式是僅使用空格,其次是僅使用製表符。混合著製表符和空格縮排的程式碼將被轉換成僅使用空格。使用帶-t選項來呼叫Python命令列直譯器時,程式碼中非法混用製表符和空格會給出警告。當使用-tt選項時這些警告就會變成錯誤。高度建議使用這些選項。
二、Maximum Line Length 行的最大長度
4.限制所有行的最大長度為 79 個字元。
三、Blank Lines 空行
5.頂層函式和類之間使用兩個空行。
6.類的方法之間使用一個空行.
7.使用額外的空白行來分隔一組相關的函式。一堆相關的單行程式碼之間的空白行可以省略(例如,一組dummy implementations)。
8.在函式中使用空行來(謹慎地)表示不同的邏輯段落。
9.Python接受control-L(即^L)換頁符作為空格;許多工具把這些字元當作頁面分隔符,所以你可以在檔案中使用它們來分隔相關段落。請注意,一些編輯器和基於Web的程式碼閱讀器可能無法識別control-L為換頁,將在其位置顯示另一個字形。
四、Encodings (PEP 263) 編碼
10.Python核心發行程式碼應該總是使用 ASCII 或 Latin-1 編碼 (又名 ISO-8859-1)。Python 3.0 和以後的版本,首選 UTF-8 而不是 Latin-1,請檢視 PEP 3120獲取更多資訊。(ps:對中文專案,請首選UTF-8。)
11.ASCII 編碼的檔案不應該有coding cookie(譯者注:# -*- coding: utf-8 -*-,# coding=utf-8)。Latin-1(或 UTF-8 )只應該當註釋或文件字串涉及作者名需要 Latin-1 時才使用;否則,使用\x,\u或\U等轉義字元是在字串中包含非 ASCII 資料的首選方法。
五、Imports 匯入
12.匯入通常應當使用單獨的行,例如:
Yes: import os import sysNo: import sys, os
還可以這麼寫:
fromsubprocessimportPopen,PIPE
13.總是位於檔案的頂部,在模組註釋和文件字串之後,在模組的全域性變數與常量之前。
14.匯入應該按照以下的順序分組:
(1)standard library imports 標準庫匯入
(2)related third party imports 相關第三方匯入
(3)local application/library specific imports 本地應用程式/庫的特定匯入
六、Whitespace in Expressions and Statements 表示式和語句中的空格
15.在下列情況下,避免多餘的空格:
緊貼著圓括號、方括號和花括號。
Yes: spam(ham[1], {eggs: 2})No:spam(ham[1],{eggs:2}
緊貼在逗號,分號或冒號之前:
Yes: if x == 4: print x, y; x, y = y, xNo: if x == 4 : print x , y ; x , y = y , x
緊貼在函式呼叫的引數列表的圓括號的開括號前:
Yes: spam(1)No: spam (1)
緊貼在索引或切片的方括號的開括號前:
Yes: dict['key'] = list[index]No: dict ['key'] = list [index]
在賦值(或其他)語句的運算子周圍,不要為了對齊而使用多個空格。
Yes:x = 1y = 2long_variable = 3No:x = 1y = 2long_variable = 3
七、Other Recommendations 其他建議
16.總是在這些二元運算子前後加一個空格:賦值(=),自增賦值(+=,-=等等), 比較(==,,!=,<>,<=,>=,in,not in,is,is not),布林運算(and,or,not)。
在算術運算子前後加空格:
Yes:i = i + 1submitted += 1x = x * 2 - 1hypot2 = x * x + y * yc = (a + b) * (a - b)No:i=i+1submitted +=1x = x*2 - 1hypot2 = x*x + y*yc = (a+b) * (a-b)
17.不要在一個關鍵字引數或者一個預設引數值的=符號前後加一個空格。
Yes:def complex(real, imag=0.0): return magic(r=real, i=imag)No:def complex(real, imag = 0.0): return magic(r = real, i = imag)
18.通常不推薦使用複合語句(一行程式碼中有多條語句)。
Yes:if foo == 'blah': do_blah_thing()do_one()do_two()do_three()Rather not:if foo == 'blah': do_blah_thing()do_one(); do_two(); do_three()
19.通常情況下,一行程式碼包括一個小的if/for/while塊,是可以的。但是多子句絕不可以。同樣,需要避免摺疊類似的長程式碼行!
Rather not:if foo == 'blah': do_blah_thing()for x in lst: total += xwhile t < 10: t = delay()Definitelynot:if foo == 'blah': do_blah_thing()else: do_non_blah_thing()try: something()finally: cleanup()do_one(); do_two(); do_three(long, argument, list, like, this)if foo == 'blah': one(); two(); three()
八、Comments 註釋
20.不好理解的註釋不如沒有註釋。註釋要和程式碼保持與時俱進!
21.註釋應該是一條完整的句子。如果註釋是一個短語或句子,它的第一個字應該大寫,除非它是一個小寫字母開頭的識別符號(絕對不要改變識別符號的大小寫)。
22.如果註釋很短,那麼結尾的句號可以省略。塊註釋通常由一個或多個段落組成, 這些段落由完整的句子構成,每個句子都應該使用句號結尾。
句號結尾的句子後面應該有2個空格。
九、Block Comments 塊註釋
23.塊註釋在一些(或全部)程式碼之前,並和程式碼縮排一致。每行註釋均以#開頭,然後緊跟一個空格(除非在註釋內縮排)。
塊註釋內的段落使用僅含#的單行分隔。
十、Inline Comments 行內註釋
24.謹慎地使用內嵌註釋
內嵌註釋是一種和語句在同一行的註釋。內嵌註釋至少和語句間隔2個空格。他們開始於一個 # 和一個空格。
十一、Documentation Strings 文件字串
25.所有的公告模組,函式,類和方法都需要編寫文件字串。對非公共的方法而言,文件字串則不是必要的,但是可以使用一個註釋來描述這個方法。這個註釋必須位於 def 行之後。
十二、Version Bookkeeping 版本註記
26.如果在程式碼原始檔中摻雜著Subversion,CVS或RCS註記,按照下面的規則書寫。
__version__ = "$Revision: dc5a21b8bc47 $"
十三、Naming Conventions 命名約定
27.Python庫的命名約定有點亂,所以我們從未達成完全一致。但是,目前有一些推薦的標準。新的模組和包(包括第三方框架)應該用這些標準,但是擁有不同風格的固有庫,還是保持內部統一更好。
十四、Descriptive: Naming Styles 描述:命名風格
28.下面是常見的優秀命名方式:
b(single lowercase letter) (單個小寫字母)
B(single uppercase letter) (單個大寫字母)
lowercase 小寫字母
lower_case_with_underscores 使用下劃線分隔的小寫字母
UPPERCASE 大寫字母
UPPER_CASE_WITH_UNDERSCORES 使用下劃線分隔的大寫字母
十五、Prescriptive: Naming Conventions 說明:命名規範
29.Names to Avoid 避免使用的名字
永遠不要使用 'l'(小寫的L),'O'(大寫的O),或者'I'(大寫的I)作為單字變數名。
在某些字型中,這些字很難和數字的0 和 1 區分。當打算用'l'的時候,用'L'來代替。
30.Package and Module Names 包和模組名稱
模組應該用簡短的,全小寫的名字。如果能增強可讀性的話,可以使用下劃線。Python的包也要用全小寫的,短名稱,但是不建議用下劃線。
因為模組名稱和檔名關聯,而且某些檔案系統大小寫不敏感,也會截斷過長的名字。所以模組選用相當簡短的名字是很重要的。在Unix下不會有這樣的問題,但是在早些的Mac、Windows 或者 DOS下會有這樣的問題。
當用C或C++連編寫一個含有Python模組提供更高層(比如,更加面向物件)介面的擴充套件模組時,這個C/C++模組要有一個前導下劃線(例如_socket)。
31.Class Names 類名
毫無例外,類名要用首字母大寫的規則。內部類,要加上前導下劃線。
32.Exception Names 異常名
異常也是類,所以這裡也用類名規則。但是,你異常名應該用字首 "Error"(如果你的異常確實是個錯誤的話)。
33.Global Variable Names 全域性變數名
(我們希望這些變數只在模組內部使用)這些規則和函式規則一樣。
被設計為通過from M import *匯入的模組。應該用__all__機制來防止匯出全域性。或者使用過去的全域性變數前置下劃線的規則(這是為了說明這些變數是"模組私有的")。
34.Function Names 函式名
函式名應該用小寫,為了增加可讀性可以用下劃線分隔。
大小寫混合僅在為了相容原有大小寫混合風格佔主體的情況下使用(比如 threading.py)。
35.Function and method arguments 函式和方法引數
始終用self作為例項方法的第一個引數。
始終用cls作為類方法的第一個引數。
如果函式的引數名和保留字衝突。用結尾下劃線比縮寫或是濫用的組詞更好。因此 class_比 clss好。(也許,更好的避免衝突的方式是用同義詞。)
36.Method Names and Instance Variables 方法名和例項變數
使用函式命名規則:使用下劃線分隔的小寫字母會提高可讀性。
只在私有方法和例項變數前用單下劃線。
使用前導雙下劃線呼叫Python的名字變化規則來避免與子類中的名字衝突。
Python 用類名來變化這個名字:如果類Foo有個屬性叫做__a,那麼它不能用 Foo.__a讀取。(執著的使用者還是可以用Foo._Foo__a.讀取。)
注意:關於__names的使用有一些爭論(見下文)。
37.Constants 常量
常量通常在模組級別中定義,用全大寫和下劃線分隔的字元來編寫。例如MAX_OVERFLOW 和 TOTAL。
十六、Designing for inheritance 繼承設計
38.總要考慮一個類的方法或例項變數(總體而言:屬性)應該是公用的或者非公用的。如果不能確定的話,設計為私有的。因為,之後將一個私有的改為公有的要比將公有的變為私有的容易。
39.公有屬性,是你希望與這個類無關的客戶使用的,並通過你的委託機制來避免由於屬性變更導致的向後不相容。私有屬性,是你不希望被第三方使用的。你不能保證私有屬性不會改變甚至被刪除。
在這裡我們沒有使用術語"private",因為在Python並沒有真正的私有屬性(為了避免大量不必要的常規工作)
另一種屬性,是"subclass API" 的一部分(通常,在某些語言裡被稱作"protected")。有一些類設計的時候是用來繼承的。用於擴充套件或者改變類的自身行為的某些方面。當設計這樣的類的時候,一定要弄清楚哪些屬性是公有的,哪些是subclass API的子集,哪些是真正只在自己的基類中使用的
貫穿著這樣的思想,如下是Python的準則:
公有屬性不應該用下劃線開始。
如果你的公有屬性和保留字衝突。那麼在屬性名後面加一個下劃線。這要比縮寫和糟糕的拼寫好很多。(然而,儘管有這樣的規則,'cls'在用作變數,或者引數時,是代表'類'的最佳選擇。特別是用作類方法的第一個引數)
十七、Programming Recommendations 程式設計建議
40.程式碼應該用不損害其他Python實現的方式去編寫(PyPy, Jython, IronPython, Cython, Psyco 等)
例如,不要依賴於CPython的高效內建字元連線語句a += b or a = a + b.這些語句在Jython中執行較慢。在效能敏感的庫中,應該用''.join()來取代。這樣可以保證在不同的實現中,字元連結花費的時間都呈線性。
41.與諸如None這樣的字元比較時,要使用is or is not,永遠不要用等於操作。
42.同樣地,在測試一個變數或引數預設值為None被設定為其他值時(比如if x表示if x is not None時),要注意。這個值應該有一個能在布林邏輯的上下文中為false的型別(比如容器)。
43.當用複雜比較實現排序操作時,最好去實現全部六個操作(__eq__, __ne__, __lt__, __le__, __gt__, __ge__),而不是依靠其他的程式碼去實現一些怪異的比較。
·
為了最大程度的減少實現這一過程的開銷。functools.total_ordering()提供了生成缺少的比較操作的方法。
44.在這裡用到類命名規範。儘管當你的“異常”是一個“錯誤”(error)時,你應該在自己的異常類加上字尾"Error"。非錯誤類(Non-error)異常,不需要特別的字尾。
45.當丟擲一個異常的時候,使用raise ValueError('message')代替舊的raise ValueError, 'message'格式。
推薦使用這種括弧的格式,當異常的引數很長或者是格式化字串的時候,由於括號的關係,我們不需要使用連字元。舊的格式在Python 3 中被移除。
當捕獲一個異常的時候,要用詳細異常宣告代替光禿禿的except:語句.
try: import platform_specific_moduleexcept ImportError: platform_specific_module = None
一個空的except:語句將會捕獲 SystemExit 和 KeyboardInterrrupt 異常。這會使得很難用Control-C來中斷一個程式,並且還會隱藏其他的問題。如果你想捕獲一個程式中的所有異常,使用except Exception:(bare 和except BaseException:是等價的)。
官網連結:https://www.python.org/dev/peps/pep-0008/