開發規範

開發規範

什麼是開發規範?爲何要有開發規範呢?html

你如今包括以前寫的一些程序,所謂的'項目',都是在一個py文件下完成的,代碼量撐死也就幾百行,你認爲沒問題,挺好。可是真正的後端開發的項目,系統等,少則幾萬行代碼,多則十幾萬,幾十萬行代碼,你全都放在一個py文件中行麼?固然你能夠說,只要能實現功能便可。我們舉個例子,若是你的衣物只有三四件,那麼你隨便堆在櫥櫃裏,沒問題,咋都能找到,也不顯得特別亂,可是若是你的衣物,有三四十件的時候,你在都堆在櫥櫃裏,可想而知,你找你穿過三天的襪子,最終從你的大衣口袋裏翻出來了,這是什麼感受和心情......git

  軟件開發,規範你的項目 目錄結構,代碼規範,遵循PEP8規範等等,讓你更加清晰滴,合理滴開發。github

  軟件開發的首要規範就是從設計目錄結構開始。redis

爲何要設計項目目錄結構?

"設計項目目錄結構",就和"代碼編程風格"同樣,屬於我的風格問題。對於這種風格上的規範,一直都存在兩種態度:編程

  1. 一類同窗認爲,這種我的風格問題"可有可無"。理由是能讓程序運行就好,風格問題根本不是問題。
  2. 另外一類同窗認爲,規範化能更好的控制程序結構,讓程序具備更高的可讀性。

我是比較偏向於後者的,由於我是前一類同窗思想行爲下的直接受害者。我曾經維護過一個很是很差讀的項目,實現的邏輯並不複雜,可是卻耗費了我很是長的時間去理解它想表達的意思。今後我我的對於提升項目可讀性、可維護性的要求就很高了。"項目目錄結構"其實也是屬於"可讀性和可維護性"的範疇,咱們設計一個層次清晰的目錄結構,就是爲了達到如下兩點:後端

  1. 可讀性高: 不熟悉這個項目代碼的人,一眼就能看懂目錄結構,知道程序啓動腳本是哪一個,測試目錄在哪兒,配置文件在哪兒等等。從而很是快速的瞭解這個項目。
  2. 可維護性高: 定義好組織規則後,維護者就能很明確地知道,新增的哪一個文件和代碼應該放在什麼目錄之下。這個好處是,隨着時間的推移,代碼/配置的規模增長,項目結構不會混亂,仍然可以組織良好。

因此,我認爲,保持一個層次清晰的目錄結構是有必要的。更況且組織一個良好的工程目錄,實際上是一件很簡單的事兒。app

較好的目錄結構方式(推薦)函數

具體分析:測試

關於README的內容

這個我以爲是每一個項目都應該有的一個文件,目的是能簡要描述該項目的信息,讓讀者快速瞭解這個項目。spa

它須要說明如下幾個事項:

  1. 軟件定位,軟件的基本功能。
  2. 運行代碼的方法: 安裝環境、啓動命令等。
  3. 簡要的使用說明。
  4. 代碼目錄結構說明,更詳細點能夠說明軟件的基本原理。
  5. 常見問題說明。

我以爲有以上幾點是比較好的一個README。在軟件開發初期,因爲開發過程當中以上內容可能不明確或者發生變化,並非必定要在一開始就將全部信息都補全。可是在項目完結的時候,是須要撰寫這樣的一個文檔的。

能夠參考Redis源碼中Readme的寫法,這裏面簡潔可是清晰的描述了Redis功能和源碼結構。

logging模塊

咱們來講一下這個logging模塊,這個模塊的功能是記錄咱們軟件的各類狀態,大家如今和我一塊兒找到紅蜘蛛的那個圖標,而後右鍵找一找是否是有個錯誤日誌.其實每一個軟件都是有錯誤日誌的,開發人員能夠經過錯誤日誌中的內容

對他的程序進行修改

咱們先來看一下函數式簡單配置

1
2
3
4
5
6
import logging  
logging.debug( 'debug message' )  
logging.info( 'info message' )  
logging.warning( 'warning message' )  
logging.error( 'error message' )  
logging.critical( 'critical message'

默認狀況下Python的logging模塊將日誌打印到了標準輸出中,且只顯示了大於等於WARNING級別的日誌,這說明默認的日誌級別設置爲WARNING(日誌級別等級CRITICAL > ERROR > WARNING > INFO > DEBUG),默認的日誌格式爲日誌級別:Logger名稱:用戶輸出消息。

咱們本身用函數寫的這個能夠正常使用可是不夠靈活,咱們看看這個靈活的

靈活配置日誌級別,日誌格式,輸出位置:

1
2
3
4
5
6
7
8
9
10
11
12
import logging  
logging.basicConfig(level=logging.DEBUG,  
                     format= '%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s' ,  
                     datefmt= '%a, %d %b %Y %H:%M:%S' ,  
                     filename= '/tmp/test.log' ,  
                     filemode= 'w' )  
   
logging.debug( 'debug message' )  
logging.info( 'info message' )  
logging.warning( 'warning message' )  
logging.error( 'error message' )  
logging.critical( 'critical message' )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
logging.basicConfig()函數中可經過具體參數來更改logging模塊默認行爲,可用參數有:
 
filename:用指定的文件名建立FiledHandler,這樣日誌會被存儲在指定的文件中。
filemode:文件打開方式,在指定了filename時使用這個參數,默認值爲「a」還可指定爲「w」。
format:指定handler使用的日誌顯示格式。
datefmt:指定日期時間格式。
level:設置rootlogger(後邊會講解具體概念)的日誌級別
stream:用指定的stream建立StreamHandler。能夠指定輸出到sys.stderr,sys.stdout或者文件(f=open(‘test.log’,’w’)),默認爲sys.stderr。若同時列出了filename和stream兩個參數,則stream參數會被忽略。
 
format參數中可能用到的格式化串:
%(name)s Logger的名字
%(levelno)s 數字形式的日誌級別
%(levelname)s 文本形式的日誌級別
%(pathname)s 調用日誌輸出函數的模塊的完整路徑名,可能沒有
%(filename)s 調用日誌輸出函數的模塊的文件名
%(module)s 調用日誌輸出函數的模塊名
%(funcName)s 調用日誌輸出函數的函數名
%(lineno)d 調用日誌輸出函數的語句所在的代碼行
%(created)f 當前時間,用UNIX標準的表示時間的浮 點數表示
%(relativeCreated)d 輸出日誌信息時的,自Logger建立以 來的毫秒數
%(asctime)s 字符串形式的當前時間。默認格式是 「2003-07-08 16:49:45,896」。逗號後面的是毫秒
%(thread)d 線程ID。可能沒有
%(threadName)s 線程名。可能沒有
%(process)d 進程ID。可能沒有
%(message)s用戶輸出的消息

logger對象配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
import logging
 
logger = logging.getLogger()
# 建立一個handler,用於寫入日誌文件
fh = logging.FileHandler( 'test.log' ,encoding= 'utf-8'
 
# 再建立一個handler,用於輸出到控制檯 
ch = logging.StreamHandler() 
formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s' )
 
fh.setLevel(logging.DEBUG)
 
fh.setFormatter(formatter) 
ch.setFormatter(formatter) 
logger.addHandler(fh) #logger對象能夠添加多個fh和ch對象 
logger.addHandler(ch) 
 
logger.debug( 'logger debug message'
logger.info( 'logger info message'
logger.warning( 'logger warning message'
logger.error( 'logger error message'
logger.critical( 'logger critical message' )

ogging庫提供了多個組件:Logger、Handler、Filter、Formatter。Logger對象提供應用程序可直接使用的接口,Handler發送日誌到適當的目的地,Filter提供了過濾日誌信息的方法,Formatter指定日誌顯示格式。另外,能夠經過:logger.setLevel(logging.Debug)設置級別,固然,也能夠經過

fh.setLevel(logging.Debug)單對文件流設置某個級別。

相關文章
相關標籤/搜索