日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python软件开发规范

發(fā)布時間:2023/12/13 python 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python软件开发规范 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

軟件開發(fā)規(guī)范

什么是軟件開發(fā)規(guī)范?

好的設(shè)計項目目錄結(jié)構(gòu),就和編碼風(fēng)格一樣,是每個程序員都有的風(fēng)格,但是在流水化標(biāo)準(zhǔn)化作業(yè)過程中,個性和風(fēng)格是

不被鼓勵的。如果你去維護(hù)一個非常不好讀的項目,雖然實現(xiàn)邏輯并不復(fù)雜,但是對后續(xù)的維護(hù)者來說就是災(zāi)難。

 一個層次清晰的目錄結(jié)構(gòu),可以提高程序的可維護(hù)性:

  • 可讀性高:

    后續(xù)維護(hù)人員可以一眼看懂目錄結(jié)構(gòu),不必為復(fù)雜混亂的層次耗費(fèi)大量精力。測試文件在哪,配置文件在哪會被放置在規(guī)范操作的地方,可以讓后續(xù)人員快速的了解這個項目。

  • 可維護(hù)性高:

    看清目錄架構(gòu)之后,維護(hù)者可以將后續(xù)新增的文件和代碼按照規(guī)范放置在規(guī)定的地方,雖然后續(xù)代碼和文件增多,但是項目目錄并不會混亂,仍然能夠快速組織良好

  • 按照分級目錄規(guī)范模擬博客園系統(tǒng)

    一個py文件下的博客園系統(tǒng):

    import json,time,os print('歡迎使用博客園系統(tǒng)') flag = 1 msg = """1.請登錄 2.請注冊 3.進(jìn)入文章頁面 4.進(jìn)入評論頁面 5.進(jìn)入日記頁面 6.進(jìn)入收藏頁面 7.注銷賬號 8.退出整個程序 """login_information = {"username": None, "status": False} def login(func=False):"""登錄函數(shù):param func: 函數(shù)名默認(rèn)為False:return: 無返回值"""time.sleep(0.1)user_name = input('請輸入你要登錄的用戶名')pwd = input('請輸入登錄密碼')landing_info = {}global login_informationwith open("userinfo.txt", "r", encoding="utf-8")as f1:for line in f1:x = line.strip()[:-2]num = int(line.strip()[-1])name = x.split(':', 1)[0]password = x.split(':', 1)[1]landing_info[name] = [password, num]if user_name in landing_info:count = landing_info[user_name][1] + 1if count == 3:print('你的賬號已鎖定,請聯(lián)系管理員解鎖')else:while count < 3:if pwd == landing_info[user_name][0]:login_information["username"] = user_namelogin_information["status"] = Trueprint("登錄成功")if func:func()breakelse:print(f"你的密碼輸入錯誤,剩余次數(shù)為{3 - count},請重新鍵入")pwd = input('請重新輸入密碼:')landing_info[user_name][1] = count + 1count += 1else:print('你的賬戶已鎖定,請聯(lián)系管理員處理')with open('userinfo.txt', 'r', encoding='utf-8')as f1, open('user.txt', 'w', encoding='utf-8') as f2:f1.seek(0, 0)for i in f1:if i.strip().split(':', 1)[0] == user_name:i = i.strip()content = i[:-1] + "3"f2.write(content + '\n')else:f2.write(i)os.remove('userinfo.txt')os.rename('user.txt', 'userinfo.txt')else:print('你輸入的賬號不存在,請先去注冊')def wrapper(f):"""操作認(rèn)證:param f: 操作函數(shù):return:"""def inner():time.sleep(1)if login_information["status"]:f()else:login(f)return innerdef registration():"""注冊函數(shù):return:"""user_info = {}num = 3while num:user_name = input('請輸入要注冊的用戶名:')pwd = input('請輸入要注冊的密碼:')num -= 1lst_name = list(range(65, 91)) + list(range(97, 123))for i in user_name:if (i.isdecimal()== True or ord(i) in lst_name) and 6 <= len(pwd) <= 14:passelse:print('用戶名或密碼無效,請重新輸入')if num == 0:print('注冊失敗')breakelse:with open('userinfo.txt', 'r+', encoding='utf-8')as f:for i in f:i = i.strip()[:-2]k, v = i.split(':')user_info[k] = vif user_name in user_info:print('用戶名已存在,請重新輸入用戶名')if num == 0:print('注冊失敗')continueelse:f.write(f"\n{user_name}:{pwd}:0")choose = input('你已經(jīng)注冊成功,是否重新注冊(重新注冊鍵入1)')if choose == '1':num = 3else:print('注冊成功,你可以去嚯嚯了')time.sleep(1)num = 3break@wrapper def article():"""文章頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入文章頁面!")@wrapper def comment():"""評論頁面:return:"""num = 1global login_informationprint(f"歡迎{login_information['username']}進(jìn)入評論頁面!")with open('com','r',encoding="utf-8") as f:for i in f:s = i.strip()print(json.loads(s))num += 1choose = input("是否評論Y or N")if choose == "Y":com = input("請輸入評論:")with open('com','a',encoding="utf-8") as f2:com1 = f"{num}樓 - {login_information['username']}:{com}"f2.write(json.dumps(com1,ensure_ascii=False)+"\n")@wrapper def diary():"""日記頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入日記頁面!")@wrapper def collect():"""收藏頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入收藏頁面!")@wrapper def off():global login_informationlogin_information["username"] = Nonelogin_information["status"] = Falselogin_information["count"] = 0print("賬戶注銷成功!")def drop():global flagflag = 0print("歡迎下次光臨")func_information = {'1': login, '2': registration, '3': article, '4': comment, '5': diary, '6': collect,'7': off, '8': drop} while flag:print(msg)choose = input("請選擇數(shù)字使用對應(yīng)功能選項:")if choose in func_information:ret = func_information[choose]ret()else:print("你的輸入有誤,請重新輸入")

    此時我們所有文件都寫在一個py文件下,如果代碼量多且都在一個py文件中,那么對于代碼結(jié)構(gòu)不清晰,不規(guī)范,運(yùn)行起來效率也會非常低。所以我們接下來一步一步的修改:

    1.軟件配置:

    我們的博客園系統(tǒng)中出現(xiàn)了多處這樣的相對路徑,如果我們用戶注冊表位置發(fā)生改變,我們需要一處一處修改,那么我們是否可以統(tǒng)一相同的路徑,也就是統(tǒng)一相同的變量,在文件的最上面寫一個變量指向userinfo注冊表的路徑,代碼中如果需要這個路徑時,直接引用即可。

    userinfo_path = r"E:\Python\week3大作業(yè)\userinfo.txt" # 我們博客園系統(tǒng)中出現(xiàn)的相對路徑均用userinfo_path替換即可

    2.劃分文件:

    一個小型的博客園系統(tǒng)已經(jīng)這么多代碼了,如果我們開發(fā)一個項目,可以想象我們的py文件該有多亂了,我們可以將這些函數(shù)進(jìn)行分類,分文件而治,我們將上述py文件依據(jù)功能劃分以下幾類:

    settings.py: 配置文件,就是放置一些項目中需要的靜態(tài)參數(shù),比如文件路徑,數(shù)據(jù)庫配置,軟件的默認(rèn)設(shè)置等等(如我們上面提到的用戶注冊表表文件)

    common.py:公共組件文件,這里面放置一些我們常用的公共組件函數(shù),并不是我們核心邏輯的函數(shù),而更像是服務(wù)于整個程序中的公用的插件,程序中需要即調(diào)用。比如我們程序中的裝飾器wrapper,有些函數(shù)是需要這個裝飾器認(rèn)證的,但是有一些是不需要這個裝飾器認(rèn)證的,它既是何處需要何處調(diào)用即可。比如還有密碼加密功能,序列化功能,日志功能等這些功能都可以放在這里。

    src.py:這個文件主要存放的就是核心邏輯功能,你看你需要進(jìn)行選擇的這些核心功能函數(shù),都應(yīng)該放在這個文件中。

    start.py:項目啟動文件。你的項目需要有專門的文件啟動,而不是在你的核心邏輯部分進(jìn)行啟動的,有人對這個可能不太理解,我為什么還要設(shè)置一個單獨(dú)的啟動文件呢?你看你生活中使用的所有電器基本都一個單獨(dú)的啟動按鈕,汽車,熱水器,電視,等等等等,那么為什么他們會單獨(dú)設(shè)置一個啟動按鈕,而不是在一堆線路板或者內(nèi)部隨便找一個地方開啟呢? 目的就是放在顯眼的位置,方便開啟。你想想你的項目這么多py文件,如果src文件也有很多,那么到底哪個文件啟動整個項目,你還得一個一個去尋找,太麻煩了,這樣我把它單獨(dú)拿出來,就是方便開啟整個項目。

    除了上面提到的幾個py文件,還有幾個非常重要的文件,類似于userinfo用戶注冊表的數(shù)據(jù)庫文件,以及以后將拓展的logging日志文件,此外,隨著項目功能的擴(kuò)展,還會多出許多的用戶數(shù)據(jù)表,個人信息表等等,因此,隨著項目的增多,單個文件夾下存放各種py文件看起來已經(jīng)非常煩亂了,此處便可以引出標(biāo)準(zhǔn)版本的項目目錄結(jié)構(gòu)了:

    按照標(biāo)準(zhǔn)項目目錄規(guī)范化博客園登錄系統(tǒng):

  • 配置啟動文件:

    import sys # 導(dǎo)入sys模塊 import os # 導(dǎo)入os模塊 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #__file__獲取當(dāng)前文件絕對路徑,整體獲取blog系統(tǒng)絕對路徑 sys.path.append(BASE_DIR) # 將blog目錄添加到環(huán)境變量 from core.src import run # 從core文件夾src.py文件導(dǎo)入run函數(shù)if __name__ == '__main__': # 程序啟動接口run()
  • 配置settings.py文件:

    import os # 導(dǎo)入os模塊 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) # blog系統(tǒng)絕對路徑 userinfo_path = os.path.join(BASE_DIR,'db','userinfo.txt') # 通過拼接獲取用戶注冊表絕對路徑 com_path = os.path.join(BASE_DIR,'db','com.txt') # 獲取評論絕對路徑 msg = """1.請登錄 2.請注冊 3.進(jìn)入文章頁面 4.進(jìn)入評論頁面 5.進(jìn)入日記頁面 6.進(jìn)入收藏頁面 7.注銷賬號 8.退出整個程序 """
  • 配置common.py文件:

    from core import src # 從core文件夾導(dǎo)入src主邏輯模塊 import time # 導(dǎo)入時間模塊 """ 操作認(rèn)證 :param f: 操作函數(shù) :return: """def wrapper(f):"""操作認(rèn)證:param f: 操作函數(shù):return:"""def inner():time.sleep(1)if src.login_information["status"]: f()else:src.login(f)return inner
  • 調(diào)整后新版博客園:

    程序啟動模塊:

    import sys import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) sys.path.append(BASE_DIR) from core import srcif __name__ == '__main__':src.run()

    配置模塊:

    import os BASE_DIR = os.path.dirname(os.path.dirname(__file__)) userinfo_path = os.path.join(BASE_DIR,'db','userinfo.txt') com_path = os.path.join(BASE_DIR,'db','com.txt') msg = """1.請登錄 2.請注冊 3.進(jìn)入文章頁面 4.進(jìn)入評論頁面 5.進(jìn)入日記頁面 6.進(jìn)入收藏頁面 7.注銷賬號 8.退出整個程序 """

    公共組件模塊:

    from core import src import time """ 操作認(rèn)證 :param f: 操作函數(shù) :return: """def wrapper(f):"""操作認(rèn)證:param f: 操作函數(shù):return:"""def inner():time.sleep(1)if src.login_information["status"]:f()else:src.login(f)return inner

    主邏輯模塊:

    import json,time,os from conf import settings from lib import common print('歡迎使用博客園系統(tǒng)') flag = 1login_information = {"username": None, "status": False} def login(func=False):"""登錄函數(shù):param func: 函數(shù)名默認(rèn)為False:return: 無返回值"""time.sleep(0.1)user_name = input('請輸入你要登錄的用戶名')pwd = input('請輸入登錄密碼')landing_info = {}global login_informationwith open(settings.userinfo_path, "r", encoding="utf-8")as f1:for line in f1:x = line.strip()[:-2]num = int(line.strip()[-1])name = x.split(':', 1)[0]password = x.split(':', 1)[1]landing_info[name] = [password, num]if user_name in landing_info:count = landing_info[user_name][1] + 1if count == 3:print('你的賬號已鎖定,請聯(lián)系管理員解鎖')else:while count < 3:if pwd == landing_info[user_name][0]:login_information["username"] = user_namelogin_information["status"] = Trueprint("登錄成功")if func:func()breakelse:print(f"你的密碼輸入錯誤,剩余次數(shù)為{3 - count},請重新鍵入")pwd = input('請重新輸入密碼:')landing_info[user_name][1] = count + 1count += 1else:print('你的賬戶已鎖定,請聯(lián)系管理員處理')with open(settings.userinfo_path, 'r', encoding='utf-8')as f1, open('user.txt', 'w', encoding='utf-8') as f2:f1.seek(0, 0)for i in f1:if i.strip().split(':', 1)[0] == user_name:i = i.strip()content = i[:-1] + "3"f2.write(content + '\n')else:f2.write(i)os.remove('userinfo.txt')os.rename('user.txt', 'userinfo.txt')else:print('你輸入的賬號不存在,請先去注冊')def registration():"""注冊函數(shù):return:"""user_info = {}num = 3while num:user_name = input('請輸入要注冊的用戶名:')pwd = input('請輸入要注冊的密碼:')num -= 1lst_name = list(range(65, 91)) + list(range(97, 123))for i in user_name:if (i.isdecimal()== True or ord(i) in lst_name) and 6 <= len(pwd) <= 14:passelse:print('用戶名或密碼無效,請重新輸入')if num == 0:print('注冊失敗')breakelse:with open(settings.userinfo_path, 'r+', encoding='utf-8')as f:for i in f:i = i.strip()[:-2]k, v = i.split(':')user_info[k] = vif user_name in user_info:print('用戶名已存在,請重新輸入用戶名')if num == 0:print('注冊失敗')continueelse:f.write(f"\n{user_name}:{pwd}:0")choose = input('你已經(jīng)注冊成功,是否重新注冊(重新注冊鍵入1)')if choose == '1':num = 3else:print('注冊成功,你可以去嚯嚯了')time.sleep(1)num = 3break@common.wrapper def article():"""文章頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入文章頁面!")@common.wrapper def comment():"""評論頁面:return:"""num = 1global login_informationprint(f"歡迎{login_information['username']}進(jìn)入評論頁面!")with open(settings.com_path,'r',encoding="utf-8") as f:for i in f:s = i.strip()print(json.loads(s))num += 1choose = input("是否評論Y or N")if choose == "Y":com = input("請輸入評論:")with open('com','a',encoding="utf-8") as f2:com1 = f"{num}樓 - {login_information['username']}:{com}"f2.write(json.dumps(settings.com_path,ensure_ascii=False)+"\n")@common.wrapper def diary():"""日記頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入日記頁面!")@common.wrapper def collect():"""收藏頁面:return:"""global login_informationprint(f"歡迎{login_information['username']}進(jìn)入收藏頁面!")@common.wrapper def off():global login_informationlogin_information["username"] = Nonelogin_information["status"] = Falselogin_information["count"] = 0print("賬戶注銷成功!")def drop():global flagflag = 0print("歡迎下次光臨")func_information = {'1': login, '2': registration, '3': article, '4': comment, '5': diary, '6': collect,'7': off, '8': drop} def run():while flag:print(settings.msg)choose = input("請選擇數(shù)字使用對應(yīng)功能選項:")if choose in func_information:ret = func_information[choose]ret()else:print("你的輸入有誤,請重新輸入") run()

    README的相關(guān)內(nèi)容

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

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

  • 軟件定位,軟件的基本功能。
  • 運(yùn)行代碼的方法: 安裝環(huán)境、啟動命令等。
  • 簡要的使用說明。
  • 代碼目錄結(jié)構(gòu)說明,更詳細(xì)點(diǎn)可以說明軟件的基本原理。
  • 常見問題說明。
  • 在軟件開發(fā)初期,由于開發(fā)過程中以上內(nèi)容可能不明確或者發(fā)生變化,并不是一定要在一開始就將所有信息都補(bǔ)全。但是在項目完結(jié)的時候,是需要撰寫這樣的一個文檔的。

    轉(zhuǎn)載于:https://www.cnblogs.com/lifangzheng/p/11284247.html

    總結(jié)

    以上是生活随笔為你收集整理的python软件开发规范的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。