淺談python編程規範和軟件開發目錄規範的重要性

前言

  我們這些初學者,目前要做的就是遵守代碼規範,這是最基本的,而且每個團隊的規範可能還不一樣,以後工作了,儘可能和團隊保持一致,目前初學者就按照官方的要求即可

  新人進入一個企業,不會接觸到核心的架構級別的代碼,這些東西大多數有大佬寫好了。所以新人要做的就是維護別人的代碼,因此代碼的可閱讀性,良好的可維護性是最重要的,關鍵的影響性能的代碼,不需要我們寫,慢慢的寫得多了,積累的多了,看幾個優秀的代碼就會了了,所以,初學者前期關注代碼規範,不寫bug,就ok.


這是小編準備的python基礎學習資料,關注,轉發,私信小編“01”即可免費領取!


淺談python編程規範和軟件開發目錄規範的重要性

  學習軟件開發目錄的規範,為了讓自己理解在開發標準軟件時候如何佈局項目目錄結構,以及注意開發規範的重要性

編程規範的重要性

首先談一下注釋:

  註釋不止是為了自己以後看的更清楚,還是為了以後的開發人員所準備的,其實一段時間後,當需要對程序做一些修改或者是改正某個bug的時候,可能未來的我們自己都會忘記相關的細節,所以此時註釋顯得尤為重要。

  每條註釋以井號(#)開始,一直到該行末尾結束,一直到該行末尾結束。我們可以在註釋中放任何東西,因為Python 會完全無視他們的存在。為了寫好註釋,這裡給出以後幾條規則:

  (1)假設讀者的Python 水平和你一樣(比如說,不要去解釋 “ 什麼是字符串 ” , 也不要去解釋 “ 什麼是賦值語句 ”)

  (2) 不要去註釋那些毫無意義的事情。比如說:

1

count = count +1 # add one to count

  (3)很多程序員會在代碼上寫上一些以 “ TODO ” 或者 “ FIXME ”開始的註釋,目的就是為了提醒他們回來編寫或清理一些未完成的一些問題。

  (4)如果你在編寫某段程序的時候需要使勁思考的話,應該編寫註釋,以後別人不會在這個地方絞盡腦汁。尤其要注意的是,如果你在開發程序的時候或者函數編寫的時候使用要點來描述,儘量寫的細緻一點,在開發工作完成之後,還應該將原來的要點全部保留下倆直接做解釋。

  (5)同樣,如果某個bug很難查明,或者其修改方案比較複雜,那麼你就應該編寫一條註釋對其進行解釋。如果不這麼做,那麼今後其他複雜該部分的代碼的程序員就會可能認定他們沒有必要這麼複雜並將其改為原來的樣子,從而將你的心血付諸東流。

  (6)如果需要大量的註釋才能解釋清楚某段代碼的作用,那麼就應該對這些代碼進行整理,比如,如果需要分別對一個函數的15個列表進行解釋,那麼就應該將該函數拆分成更小的代碼塊,每隔分別只處理較小的幾個列表。

  (7) 過時的註釋還不如沒有註釋,因此修改某段代碼後,一定要檢查相關注釋,並對其做出適當的修改以保證其仍然能夠準確描述代碼的功能。

  (8) 註釋不是越多越好,弄得整篇代碼都是註釋,卻很少看到代碼,這樣就曲解了註釋的意思了。

所以說,一定要養成良好的註釋代碼的習慣,邊寫代碼邊註釋,及時的記錄下來你的思路。還有就是多提高自己對代碼的解釋能力,用精煉的語言表達出代碼的核心價值所在,那麼你寫的代碼就是成功的。

下面舉個例子:

淺談python編程規範和軟件開發目錄規範的重要性

Python 中的特殊註釋(大家注意一下)

比如:Python有一行聲明python編碼格式的單行註釋。這行註釋指定文件為 utf-8 編碼。這行特殊註釋只能放在文件的第一行或者開頭

1

#_*_coding:utf-8_*_

還有一種是說明腳本語言是python的,是要用/usr/bin下面的程序(工具)python,這個解釋器,來解釋python腳本,來運行python腳本的。

1

#!/usr/bin/python

再說一下規範命名變量:

因為名字不能亂起,要是你一個想法,他一個想法,大家都對對方的名稱不瞭解,這樣也很難持續下去,因此這裡說一下變量規範命名的規則和注意事項。

1,變量定義規則:

    1,變量名只能是字母,數字或者下劃線的任意組合

    2,變量名的第一個字符不能是數字

    3,關鍵字不能生成變量名

2,變量規範命名注意事項:

    1,變量名不能過長

    2,變量名詞不達意思

    3,變量名為中文,拼音

3,總體命名規則:

    1 ,儘量單獨使用小寫字母‘l’,大寫字母‘O’等容易混淆的字母。    2 ,模塊命名儘量短小,使用全部小寫的方式,可以使用下劃線。    3 ,包命名儘量短小,使用全部小寫的方式,不可以使用下劃線。    4 ,類的命名使用CapWords的方式,模塊內部使用的類採用_CapWords的方式。    5 ,異常命名使用CapWords+Error後綴的方式。    6 ,全局變量儘量只在模塊內有效,類似C語言中的static。實現方法有兩種,一是__all__機制;二是前綴一個下劃線。    7 ,函數命名使用全部小寫的方式,可以使用下劃線。    8 ,常量命名使用全部大寫的方式,可以使用下劃線。    9 ,類的屬性(方法和變量)命名使用全部小寫的方式,可以使用下劃線。    10,類的屬性有3種作用域public、non-public和subclass API,可以理解成C++中的public、private、protected,non-public屬性前,前綴一條下劃線。    11 ,類的屬性若與關鍵字名字衝突,後綴一下劃線,儘量不要使用縮略等其他方式。    12 ,為避免與子類屬性命名衝突,在類的一些屬性前,前綴兩條下劃線。比如:類Foo中聲明__a,訪問時,只能通過Foo._Foo__a,避免歧義。如果子類也叫Foo,那就無能為力了。    13 ,類的方法第一個參數必須是self,而靜態方法第一個參數必須是cls。

下面說一下排版問題:

一,代碼排版:

    1 ,縮進。4個空格的縮進(編輯器都可以完成此功能),不使用Tap,更不能混合使用Tap和空格。    2 ,每行最大長度79,換行可以使用反斜槓,最好使用圓括號。換行點要在操作符的後邊敲回車。    3 ,類和top-level函數定義之間空兩行;類中的方法定義之間空一行;函數內邏輯無關段落之間空一行;其他地方儘量不要再空行。

二,文檔排版:

    1 ,模塊內容的順序:模塊說明和docstring—import—globals&constants—其他定義。其中import部分,又按標準、三方和自己編寫順序依次排放,之間空一行。    2 ,不要在一句import中多個庫,比如import os, sys不推薦。    3 ,如果採用from XX import XX引用庫,可以省略‘module.’,都是可能出現命名衝突,這時就要採用import XX。

三,空格的使用:

    總體原則,避免不必要的空格    1 ,各種右括號前不要加空格。    2 ,逗號、冒號、分號前不要加空格。    3 ,函數的左括號前不要加空格。如Func(1)。    4 ,序列的左括號前不要加空格。如list[2]。    5 ,操作符左右各加一個空格,不要為了對齊增加空格。    6 ,函數默認參數使用的賦值符左右省略空格。    7 ,不要將多句語句寫在同一行,儘管使用‘;’允許。    8 ,if/for/while語句中,即使執行語句只有一句,也必須另起一行。

最後談一下對自己和大家的建議

    1 ,編碼中考慮到其他python實現的效率等問題,比如運算符‘+’在CPython(Python)中效率很高,都是Jython中卻非常低,所以應該採用.join()的方式。    2 ,儘可能使用‘is’‘is not’取代‘==’,比如if x is not None 要優於if x。    3 ,使用基於類的異常,每個模塊或包都有自己的異常類,此異常類繼承自Exception。    4 ,異常中不要使用裸露的except,except後跟具體的exceptions。    5 ,異常中try的代碼儘可能少。比如:

淺談python編程規範和軟件開發目錄規範的重要性

6 ,使用startswith() and endswith()代替切片進行序列前綴或後綴的檢查。比如:

淺談python編程規範和軟件開發目錄規範的重要性

 7 ,使用isinstance()比較對象的類型。比如:

淺談python編程規範和軟件開發目錄規範的重要性

8 ,判斷序列空或不空,有如下規則:

淺談python編程規範和軟件開發目錄規範的重要性

   9 .字符串不要以空格收尾。   10 .二進制數據判斷使用 if boolvalue的方式。

軟件開發目錄規範的重要性

為什麼要設計好目錄結構?

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

  1. 一類同學認為,這種個人風格問題"無關緊要"。理由是能讓程序work就好,風格問題根本不是問題。
  2. 另一類同學認為,規範化能更好的控制程序結構,讓程序具有更高的可讀性。

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

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

所以,我認為,保持一個層次清晰的目錄結構是有必要的。更何況組織一個良好的工程目錄,其實是一件很簡單的事兒。

目錄組織方式

關於如何組織一個較好的Python工程目錄結構,已經有一些得到了共識的目錄結構。在Stackoverflow的這個問題上,能看到大家對Python目錄結構的討論。

這裡面說的已經很好了,我也不打算重新造輪子列舉各種不同的方式,這裡面我說一下我的理解和體會。

假設你的項目名為foo, 我比較建議的最方便快捷目錄結構這樣就足夠了:

淺談python編程規範和軟件開發目錄規範的重要性

簡要解釋一下:

  • bin/: 存放項目的一些可執行文件,當然你可以起名script/之類的也行。
  • foo/: 存放項目的所有源代碼。(1) 源代碼中的所有模塊、包都應該放在此目錄。不要置於頂層目錄。(2) 其子目錄tests/存放單元測試代碼; (3) 程序的入口最好命名為main.py。
  • docs/: 存放一些文檔。
  • setup.py: 安裝、部署、打包的腳本。
  • requirements.txt: 存放軟件依賴的外部Python包列表。
  • README: 項目說明文件。

除此之外,有一些方案給出了更加多的內容。比如LICENSE.txt,ChangeLog.txt文件等,我沒有列在這裡,因為這些東西主要是項目開源的時候需要用到。如果你想寫一個開源軟件,目錄該如何組織,可以參考這篇文章。

下面,再簡單講一下我對這些目錄的理解和個人要求吧。

淺談python編程規範和軟件開發目錄規範的重要性

關於README的內容

如何寫標準的README文件,請看博客:http://www.cnblogs.com/wj-1314/p/8547763.html

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

它需要說明以下幾個事項:

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

關於requirements.txt和setup.py

setup.py

一般來說,用setup.py來管理代碼的打包、安裝、部署問題。業界標準的寫法是用Python流行的打包工具setuptools來管理這些事情。這種方式普遍應用於開源項目中。不過這裡的核心思想不是用標準化的工具來解決這些問題,而是說,

一個項目一定要有一個安裝部署工具,能快速便捷的在一臺新機器上將環境裝好、代碼部署好和將程序運行起來。

這個我是踩過坑的。

我剛開始接觸Python寫項目的時候,安裝環境、部署代碼、運行程序這個過程全是手動完成,遇到過以下問題:

  1. 安裝環境時經常忘了最近又添加了一個新的Python包,結果一到線上運行,程序就出錯了。
  2. Python包的版本依賴問題,有時候我們程序中使用的是一個版本的Python包,但是官方的已經是最新的包了,通過手動安裝就可能裝錯了。
  3. 如果依賴的包很多的話,一個一個安裝這些依賴是很費時的事情。
  4. 新同學開始寫項目的時候,將程序跑起來非常麻煩,因為可能經常忘了要怎麼安裝各種依賴。

setup.py可以將這些事情自動化起來,提高效率、減少出錯的概率。"複雜的東西自動化,能自動化的東西一定要自動化。"是一個非常好的習慣。

setuptools的文檔比較龐大,剛接觸的話,可能不太好找到切入點。學習技術的方式就是看他人是怎麼用的,可以參考一下Python的一個Web框架,flask是如何寫的: setup.py

當然,簡單點自己寫個安裝腳本(deploy.sh)替代setup.py也未嘗不可。

requirements.txt

這個文件存在的目的是:

  1. 方便開發者維護軟件的包依賴。將開發過程中新增的包添加進這個列表中,避免在 setup.py 安裝依賴時漏掉軟件包。
  2. 方便讀者明確項目使用了哪些Python包。

這個文件的格式是每一行包含一個包依賴的說明,通常是flask>=0.10這種格式,要求是這個格式能被pip識別,這樣就可以簡單的通過 pip install -r requirements.txt來把所有Python包依賴都裝好了。具體格式說明: 點這裡。

淺談python編程規範和軟件開發目錄規範的重要性

關於配置文件的使用方法

注意,在上面的目錄結構中,沒有將conf.py放在源碼目錄下,而是放在docs/目錄下。

很多項目對配置文件的使用做法是:

  1. 配置文件寫在一個或多個python文件中,比如此處的conf.py。
  2. 項目中哪個模塊用到這個配置文件就直接通過import conf這種形式來在代碼中使用配置。

這種做法我不太贊同:

  1. 這讓單元測試變得困難(因為模塊內部依賴了外部配置)
  2. 另一方面配置文件作為用戶控制程序的接口,應當可以由用戶自由指定該文件的路徑。
  3. 程序組件可複用性太差,因為這種貫穿所有模塊的代碼硬編碼方式,使得大部分模塊都依賴conf.py這個文件。

所以,我認為配置的使用,更好的方式是,

  1. 模塊的配置都是可以靈活配置的,不受外部配置文件的影響。
  2. 程序的配置也是可以靈活控制的。

能夠佐證這個思想的是,用過nginx和mysql的同學都知道,nginx、mysql這些程序都可以自由的指定用戶配置。

所以,不應當在代碼中直接import conf來使用配置文件。上面目錄結構中的conf.py,是給出的一個配置樣例,不是在寫死在程序中直接引用的配置文件。可以通過給main.py啟動參數指定配置路徑的方式來讓程序讀取配置內容。當然,這裡的conf.py你可以換個類似的名字,比如settings.py。或者你也可以使用其他格式的內容來編寫配置文件,比如settings.yaml之類的。


分享到:


相關文章: