python的PEP8規範

測開小菜鳥發表於2020-11-25


換行

  1. 主動換行
foo_bar(self, width, height, color='black', design=None, x='foo',
              emphasis=None, highlight=0)
  1. 括號隱式連線
if (width == 0 and height == 0 and
    color == 'red' and emphasis == 'strong'):
x = ('這是一個非常長非常長非常長非常長 '
      '非常長非常長非常長非常長非常長非常長的字串')
  1. 在沒有else的情況下,if語句可以獨佔一行
if 1: print(1)

括號

  1. 不要在返回值或條件語句中使用括號,除非需要數學計算或行連線
    正確:
class A():
	return 1+1

糟糕:

class A():
	return1+1

縮排

  1. 函式引數與起始變數對齊
foo = long_function_name(var_one, var_two,
                         var_three, var_four)
  1. 四個空格縮排風格
foo = long_function_name(
	      var_one, var_two, var_three,
	      var_four)
foo = {
	long_dictionary_key:
    long_dictionary_value,
    ...
}

空行

  1. 頂級定義之間空兩行
class A():
	pass


class B():
	pass
  1. 方法定義之間空一行
class A():
	def a():
		pass
	
	def b():
		pass

空格

  1. 括號裡不要有空格

  2. 在逗號冒號分號後面新增空格

if 0: return 1

註釋

  1. 註釋中的url不管多長應寫在一行內,不要換行
url = 'https://www.baidu.com/s?ie=utf-8&tn=88093251_75_hao_pg&wd=python%20__next__/hgasuidgyugvdasbdiyagsyd'
  1. 不要用空格垂直對齊註釋
    錯誤示範:
a=1       # 變數a=1
b = a+1+1 # b = a+1+1
  1. 文件註釋
"""方法簡要說明

   方法詳細說明

    Args:
        引數: 引數說明.

     Returns:
         返回值說明. For
example:

         返回值示例

     Raises:
          IOError: 異常說明
"""
  1. 程式碼塊註釋
    程式碼塊中,對於複雜的操作, 應該在其操作開始前寫上若干行註釋. 對於不是一目瞭然的程式碼, 應在其行尾新增註釋.絕不要描述程式碼. 假設閱讀程式碼的人比你更懂Python, 他只是不知道你的程式碼要做什麼.
  2. TODO
    為臨時程式碼使用TODO註釋, 它是一種短期解決方案. 不算完美, 但夠好了.TODO註釋應該在所有開頭處包含"TODO"字串, 緊跟著是用括號括起來的你的名字, email地址或其它識別符號. 然後是一個可選的冒號. 接著必須有一行註釋, 解釋要做什麼. 主要目的是為了有一個統一的TODO格式
# TODO(Aaron) Change this to use relations.

繼承

  1. 如果一個類不繼承自其它類, 就顯式的從object繼承. 巢狀類也一樣.
class OuterClass(object):

    class InnerClass(object):
        pass

迴圈

  1. 避免在迴圈中用+和+=操作符來累加字串. 由於字串是不可變的, 這樣做會建立不必要的臨時物件, 並且導致二次方而不是線性的執行時間. 作為替代方案, 你可以將每個子串加入列表, 然後在迴圈結束後用 .join 連線列表.

字串

  1. 為多行字串使用三重雙引號"""而非三重單引號’’’. 當且僅當專案中使用單引號’來引用字串時, 才可能會使用三重’’’

關閉檔案

  1. 關閉類檔案物件的方法,對於不支援使用"with"語句的類似檔案的物件,使用contextlib.closing():
import contextlib
with contextlib.closing(urllib.urlopen("http://www.python.org/")) as front_page:
    for line in front_page:
        print line

匯入

  1. 每個匯入獨佔一行
    匯入順序:
  • 標準庫匯入
  • 第三方庫匯入
  • 應用程式指定匯入
# 不推薦:
import sys, os
# 但是可以這樣:
from subprocess import Popen, PIPE

下劃線

  1. 用單下劃線(_)開頭表示模組變數或函式是protected的(使用import * from時不會包含).
  2. 用雙下劃線(__)開頭的例項變數或方法表示類內私有.

  1. 將相關的類和頂級函式放在同一個模組裡. 不像Java, 沒必要限制一個類一個模組.

main

  1. 即使是一個打算被用作指令碼的檔案, 也應該是可匯入的. 並且簡單的匯入不應該導致這個指令碼的主功能(main functionality)被執行, 這是一種副作用. 主功能應該放在一個main()函式中.

判斷

  1. 空序列的判斷
# 正確: 
if not seq:
if seq:
# 糟糕: 
if len(seq):
if not len(seq):

通用

  1. 不要為了遵守PEP約定而破壞相容性!
  2. 所有行限制的最大字元數為79。

相關文章