成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python模塊化開(kāi)發(fā):構(gòu)建可重用、可維護(hù)的代碼

開(kāi)發(fā) 前端
模塊化開(kāi)發(fā)是Python編程中的一個(gè)重要實(shí)踐。通過(guò)將代碼分解為獨(dú)立的模塊,我們可以更好地管理、組織和復(fù)用代碼。

在現(xiàn)代軟件開(kāi)發(fā)中,模塊化開(kāi)發(fā)已成為一種不可或缺的方法。它不僅為我們構(gòu)建復(fù)雜的應(yīng)用程序提供了架構(gòu)上的便利,還能夠提高代碼的可重用性、可維護(hù)性和可擴(kuò)展性。在Python這樣的高級(jí)編程語(yǔ)言中,模塊化開(kāi)發(fā)的概念更是得到了廣泛的應(yīng)用。通過(guò)將代碼拆分為獨(dú)立的模塊,我們能夠更好地組織和管理代碼,讓我們的項(xiàng)目變得更加靈活、可測(cè)試和可維護(hù)。

一、自定義模塊

定義:一個(gè)模塊就是一個(gè)包含了python定義和聲明的文件,文件名就是模塊名字加上.py的后綴。封裝語(yǔ)句的最小單位,本質(zhì)就是.py文件。

自定義模塊:實(shí)際上就是定義.py,其中可以包含:變量定義,可執(zhí)行語(yǔ)句,for循環(huán),函數(shù)定義等等,它們統(tǒng)稱模塊的成員。(模塊本身不宜過(guò)大,便于維護(hù))

一個(gè)py文件拆分100文件,100個(gè)py文件又有相似相同的功能.冗余. 此時(shí)你要將100個(gè)py文件中相似相同的函數(shù)提取出來(lái), input 功能,print()功能, time.time() os.path.....放在一個(gè)文件,當(dāng)你想用這個(gè)功能拿來(lái)即用.類似于這個(gè)py文件: 常用的相似的功能集合模塊。

模塊就是一個(gè)py文件常用的相似的功能集合。

1.模塊和包

import hashlib


def encrypt(data):
    """ 數(shù)據(jù)加密 """
    hash_object = hashlib.md5()
    hash_object.update(data.encode('utf-8'))
    return hash_object.hexdigest()


user = input("請(qǐng)輸入用戶名:")
pwd = input("請(qǐng)輸入密碼:")
md5_password = encrypt(pwd)

message = "用戶名:{},密碼:{}".format(user, md5_password)
print(message)

在開(kāi)發(fā)簡(jiǎn)單的程序時(shí),使用一個(gè)py文件就可以搞定,如果程序比較龐大,需要10w行代碼,此時(shí)為了代碼結(jié)構(gòu)清晰,將功能按照某種規(guī)則拆分到不同的py文件中,使用時(shí)再去導(dǎo)入即可。另外,當(dāng)其他項(xiàng)目也需要此項(xiàng)目的某些模塊時(shí),也可以直接把模塊拿過(guò)去使用,增加重用性。

如果按照某個(gè)規(guī)則進(jìn)行拆分,發(fā)現(xiàn)拆分到 commons.py 中函數(shù)太多,也可以通過(guò)文件夾來(lái)進(jìn)行再次拆分,例如:

├── commons
│   ├── convert.py
│   ├── page.py
│   └── utils.py
└── run.py

在Python中一般對(duì)文件和文件的稱呼(很多開(kāi)發(fā)者的平時(shí)開(kāi)發(fā)中也有人都稱為模塊):

  • 一個(gè)py文件,模塊(module)。
  • 含多個(gè)py文件的文件夾,包(package)。

注意:在包(文件夾)中有一個(gè)默認(rèn)內(nèi)容為空的__init__.py的文件,一般用于描述當(dāng)前包的信息(在導(dǎo)入他下面的模塊時(shí),也會(huì)自動(dòng)加載)。

  • py2必須有,如果沒(méi)有導(dǎo)入包就會(huì)失敗。
  • py3可有可無(wú)。

2. 導(dǎo)入

當(dāng)定義好一個(gè)模塊或包之后,如果想要使用其中定義的功能,必須要先導(dǎo)入,然后再能使用。

導(dǎo)入,其實(shí)就是將模塊或包加載的內(nèi)存中,以后再去內(nèi)存中去拿就行。

關(guān)于導(dǎo)如時(shí)的路徑:

在Python內(nèi)部默認(rèn)設(shè)置了一些路徑,導(dǎo)入模塊或包時(shí),都會(huì)按照指定順序逐一去特定的路徑查找。

import sys
print(sys.path)
[
    '當(dāng)前執(zhí)行腳本所在的目錄', /Users/wupeiqi/PycharmProjects/luffyCourse/day14/bin
 /Users/wupeiqi/PycharmProjects/luffyCourse/day14
    '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_display',
    '/Library/Frameworks/Python.framework/Versions/3.9/lib/python39.zip',
    '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9',
    '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload',
    '/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages',
    '/Applications/PyCharm.app/Contents/plugins/python/helpers/pycharm_matplotlib_backend'
    
]

windows:

[
    'C:\\Users\\Administrator\\Desktop\\pythonPro\\01.核心編程\\8.模塊', 
    'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python39\\python39.zip', 
    'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python39\\DLLs', 
    'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python39\\lib', 
    'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python39', 
    'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python39\\site-packages', 
    'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python39\\site-packages\\win32', 
    'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python39\\site-packages\\win32\\lib', 
    'C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python39\\site-packages\\Pythonwin', 
    'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python39\\lib\\site-packages'
]

想要導(dǎo)入任意的模塊和包,都必須寫在如下路徑下,才能被找到。

也可以自動(dòng)手動(dòng)在sys.path中添加指定路徑,然后再導(dǎo)入可以,例如:

import sys
sys.path.append("路徑A")

import xxxxx  # 導(dǎo)入路徑A下的一個(gè)xxxxx.py文件

你以后寫模塊名稱時(shí),千萬(wàn)不能和內(nèi)置和第三方的同名(新手容易犯錯(cuò)誤)。

項(xiàng)目執(zhí)行文件一般都在項(xiàng)目根目錄,如果執(zhí)行文件嵌套的內(nèi)存目錄,就需要自己手動(dòng)在sys.path中添加路徑。

pycharm中默認(rèn)會(huì)將項(xiàng)目目錄加入到sys.path中。

關(guān)于導(dǎo)入的方式:

導(dǎo)入本質(zhì)上是將某個(gè)文件中的內(nèi)容先加載到內(nèi)存中,然后再去內(nèi)存中拿過(guò)來(lái)使用。而在Python開(kāi)發(fā)中常用的導(dǎo)入的方式有2類方式,每類方式都也多種情況。

第一類:import xxxx(開(kāi)發(fā)中,一般多用于導(dǎo)入sys.path目錄下的一個(gè)py文件)

  • 模塊級(jí)別
├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   ├── tencent
│   │   ├── __init__.py
│   │   ├── sms.py
│   │   └── wechat.py
│   └── utils.py
├── many.py
└── run.py
  • 包級(jí)別
├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   └── utils.py
├── third
│   ├── __init__.py
│   ├── ali
│   │   └── oss.py
│   └── tencent
│       ├── __init__.py
│       ├── __pycache__
│       ├── sms.py
│       └── wechat.py
└── run.py

第二類:from xxx import xxx 【常用】,一般適用于多層嵌套和導(dǎo)入模塊中某個(gè)成員的情況。

成員級(jí)別:

├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   └── utils.py
├── many.py
└── run.py

提示:基于from模式也可以支持 from many import *,即:導(dǎo)入一個(gè)模塊中所有的成員(可能會(huì)重名,所以用的少)。

模塊級(jí)別:

├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   └── utils.py
├── many.py
└── run.py

包級(jí)別:

├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   ├── tencent
│   │   ├── __init__.py
│   │   ├── sms.py
│   │   └── wechat.py
│   └── utils.py
├── many.py
└── run.py

3. 相對(duì)導(dǎo)入

在導(dǎo)入模塊時(shí),對(duì)于 from xx import xx這種模式,還支持相對(duì)到導(dǎo)入。切記,相對(duì)導(dǎo)入只能用在包中的py文件中(即:嵌套在文件中的py文件才可以使用,項(xiàng)目根目錄下無(wú)法使用)。

4. 導(dǎo)入別名

如果項(xiàng)目中導(dǎo)入 成員/模塊/包 有重名,那么后導(dǎo)入的會(huì)覆蓋之前導(dǎo)入,為了避免這種情況的發(fā)生,Python支持重命名,即:

from xxx.xxx import xx as xo
import x1.x2 as pg

除此之外,有了as的存在,讓 import xx.xxx.xxxx.xxx 在調(diào)用執(zhí)行時(shí),會(huì)更加簡(jiǎn)單(「不常用,了解即可」)。

原來(lái):

import commons.page

v1 = commons.page.pagination()

現(xiàn)在:

import commons.page as pg

v1 = pg.pagination()

5. 主文件

執(zhí)行一個(gè)py文件時(shí):

__name__ = "__main__"

導(dǎo)入一個(gè)py文件時(shí):

__name__ = "模塊名"

主文件,其實(shí)就是在程序執(zhí)行的入口文件,例如:

├── commons
│   ├── __init__.py
│   ├── convert.py
│   ├── page.py
│   ├── tencent
│   │   ├── __init__.py
│   │   ├── sms.py
│   │   └── wechat.py
│   └── utils.py
├── many.py
└── run.py

我們通常是執(zhí)行 run.py 去運(yùn)行程序,其他的py文件都是一些功能代碼。當(dāng)我們?nèi)?zhí)行一個(gè)文件時(shí),文件內(nèi)部的 __name__變量的值為 main,所以,主文件經(jīng)常會(huì)看到:

import many
from commons import page
from commons import utils


def start():
    v1 = many.show()
    v2 = page.pagination()
    v3 = utils.encrypt()


if __name__ == '__main__':
    start()

只有是以主文件的形式運(yùn)行此腳本時(shí)start函數(shù)才會(huì)執(zhí)行,被導(dǎo)入時(shí)則不會(huì)被執(zhí)行。

二、第三方模塊

第三方模塊6000種左右,pip install 需要這個(gè)指令安裝的模塊,Beautiful_soup,request,Django,flask 等等。Python內(nèi)部提供的模塊有限,所以在平時(shí)在開(kāi)發(fā)的過(guò)程中,經(jīng)常會(huì)使用第三方模塊。而第三方模塊必須要先安裝才能可以使用,下面介紹常見(jiàn)的3中安裝第三方模塊的方式。其實(shí),使用第三方模塊的行為就是去用別人寫好并開(kāi)源出來(lái)的py代碼,這樣自己拿來(lái)就用,不必重復(fù)造輪子了。。。。

1. pip(最常用)

這是Python中最最最常用的安裝第三方模塊的方式。

pip其實(shí)是一個(gè)第三方模塊包管理工具,默認(rèn)安裝Python解釋器時(shí)自動(dòng)會(huì)安裝,默認(rèn)目錄:

MAC系統(tǒng),即:Python安裝路徑的bin目錄下
 /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3
 /Library/Frameworks/Python.framework/Versions/3.9/bin/pip3.9
 
Windows系統(tǒng),即:Python安裝路徑的scripts目錄下
 C:\Python39\Scripts\pip3.exe
 C:\Python39\Scripts\pip3.9.exe

提示:為了方便在終端運(yùn)行pip管理工具,我們也會(huì)把它所在的路徑添加到系統(tǒng)環(huán)境變量中。

pip3 install 模塊名稱

默認(rèn)安裝的是最新的版本,如果想要指定版本:

pip3 install 模塊名稱==版本

例如:
pip3 install django==2.2

(1) pip更新

上圖的黃色字體提示:目前我電腦上的pip是20.2.3版本,最新的是 20.3.3 版本,如果想要升級(jí)為最新的版本,可以在終端執(zhí)行他提示的命令:

/Library/Frameworks/Python.framework/Versions/3.9/bin/python3.9 -m pip install --upgrade pip

注意:根據(jù)自己電腦的提示命令去執(zhí)行,不要用我這里的提示命令哈。

(2) 豆瓣源

pip默認(rèn)是去 https://pypi.org 去下載第三方模塊(本質(zhì)上就是別人寫好的py代碼),國(guó)外的網(wǎng)站速度會(huì)比較慢,為了加速可以使用國(guó)內(nèi)的豆瓣源。因此可以設(shè)置鏡像源的方式:

一次性使用:

pip3.9 install 模塊名稱  -i  https://pypi.douban.com/simple/

永久使用(配置):

# 在終端執(zhí)行如下命令
pip3.9 config set global.index-url https://pypi.douban.com/simple/

# 執(zhí)行完成后,提示在我的本地文件中寫入了豆瓣源,以后再通過(guò)pip去安裝第三方模塊時(shí),就會(huì)默認(rèn)使用豆瓣源了。
# 自己以后也可以打開(kāi)文件直接修改源地址。
Writing to /Users/wupeiqi/.config/pip/pip.conf

寫在最后,也還有其他的源可供選擇(豆瓣應(yīng)用廣泛):

阿里云:http://mirrors.aliyun.com/pypi/simple/
中國(guó)科技大學(xué):https://pypi.mirrors.ustc.edu.cn/simple/ 
清華大學(xué):https://pypi.tuna.tsinghua.edu.cn/simple/
中國(guó)科學(xué)技術(shù)大學(xué):http://pypi.mirrors.ustc.edu.cn/simple/

2. 其他方式

(1) 源碼

如果要安裝的模塊在pypi.org中不存在 或 因特殊原因無(wú)法通過(guò)pip install 安裝時(shí),可以直接下載源碼,然后基于源碼安裝,由于這種方式比較繁瑣,這里有想法的可以自己去探索。

(2) 基于wheel

wheel是Python的第三方模塊包的文件格式的一種,我們也可以基于wheel去安裝一些第三方模塊。安裝wheel格式支持,這樣pip再安裝第三方模塊時(shí),就可以處理wheel格式的文件了。

pip3.9 install wheel

下載第三方的包(wheel格式),例如:

進(jìn)入下載目錄,在終端基于pip直接安裝:

pip3 install requests-2.25.1-py2.py3-none-any.whl

無(wú)論通過(guò)什么形式去安裝第三方模塊,默認(rèn)模塊的安裝路徑在:

Max系統(tǒng):
 /Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site-packages
Windows系統(tǒng):
 C:\Python39\Lib\site-packages\

提醒:這個(gè)目錄在sys.path中,所以我們直接在代碼中直接導(dǎo)入下載的第三方包是沒(méi)問(wèn)題的。

三、內(nèi)置模塊

內(nèi)置模塊200種左右,python解釋器自帶的模塊,time os sys hashlib等等。

Python內(nèi)置的模塊有很多,我們也已經(jīng)接觸了不少相關(guān)模塊,接下來(lái)咱們就來(lái)做一些匯總和介紹。

內(nèi)置模塊有很多 & 模塊中的功能也非常多,我們是沒(méi)有辦法注意全局給大家講解,在此我會(huì)整理出項(xiàng)目開(kāi)發(fā)最常用的來(lái)進(jìn)行講解。

1.os模塊

OS提供了一些關(guān)于文件操作的功能:

import os

# 1. 獲取當(dāng)前腳本絕對(duì)路徑
abs_path = os.path.abspath(__file__)
print(abs_path)

# 2. 獲取當(dāng)前文件的上級(jí)目錄

base_path = os.path.dirname( os.path.dirname(路徑) )
print(base_path)

# 3. 路徑拼接
p1 = os.path.join(base_path, 'xx')
print(p1)

p2 = os.path.join(base_path, 'xx', 'oo', 'a1.png')
print(p2)

# 4. 判斷路徑是否存在
exists = os.path.exists(p1)
print(exists)

# 5. 創(chuàng)建文件夾
os.makedirs(路徑)

path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
if not os.path.exists(path):
    os.makedirs(path)

# 6. 是否是文件夾
file_path = os.path.join(base_path, 'xx', 'oo', 'uuuu.png')
is_dir = os.path.isdir(file_path)
print(is_dir) # False

folder_path = os.path.join(base_path, 'xx', 'oo', 'uuuu')
is_dir = os.path.isdir(folder_path)
print(is_dir) # True

# 7. 刪除文件或文件夾
os.remove("文件路徑")

2. random

此模塊提供了和隨機(jī)數(shù)獲取相關(guān)的方法:

  • random.random():獲取從[0.0 , 1.0) 范圍內(nèi)的浮點(diǎn)數(shù)。
improt random
print(random.random())
# 0.8595089778726372
  • random.randint(a,b):獲取[a,b] 范圍內(nèi)的整數(shù)。
print(random.randint(3,10))
  • random.uniform(a,b):獲取[a,b) 范圍內(nèi)的浮點(diǎn)數(shù)。   取決于操作系統(tǒng)
print(random.uniform(3,5))
  • random.shuffle(x):把參數(shù)指定的數(shù)據(jù)中的元素打亂,其中參數(shù)必須是可變數(shù)據(jù)類型。混洗。(直接修改原列表)
lst = list(range(10))
random.shuffle(lst)
print(lst)
# [4, 6, 2, 7, 0, 8, 9, 3, 5, 1]
  • random.choice(seq):函數(shù)可以從非空序列中取出一個(gè)隨機(jī)元素。
alist = list('abcdef')
random.choice(alist)
  • random.choices(population, weights=None, *, cum_weights=None, k=1)函數(shù)可以從總體中隨機(jī)抽取(有放回抽樣)出容量為k的樣本并返回樣本的列表,可以通過(guò)參數(shù)指定個(gè)體的權(quán)重,如果沒(méi)有指定權(quán)重,個(gè)體被選中的概率均等。
random.choices(alist,k=4)
# ['b', 'f', 'b', 'f']
  • random.sample(x,k):從x中隨機(jī)取k個(gè)數(shù)據(jù),組成一個(gè)列表返回。  (從不可變數(shù)據(jù)類型中取)(變相打亂元組,數(shù)據(jù))
t = (1,2,3)

lst = random.sample(t,len(t))
print(lst)

小應(yīng)用:驗(yàn)證碼

import random

def get_random_code(length=6):
    data = []
    for i in range(length):
        v = random.randint(65,90)
        data.append(chr(v))

    return  ''.join(data)


code = get_random_code()
print(code)

關(guān)于內(nèi)置模塊還有很多,這里我們不做更多的介紹,會(huì)在后面繼續(xù)更新...

四、項(xiàng)目開(kāi)發(fā)規(guī)范

現(xiàn)階段,我們?cè)陂_(kāi)發(fā)一些程序時(shí)(終端運(yùn)行),應(yīng)該遵循一些結(jié)構(gòu)的規(guī)范,讓你的系統(tǒng)更加專業(yè)。

1. 單文件應(yīng)用

當(dāng)基于python開(kāi)發(fā)簡(jiǎn)單應(yīng)用時(shí)(一個(gè)py文件就能搞定),需要注意如下幾點(diǎn)。

"""
1.文件注釋
"""

# 2.導(dǎo)包(內(nèi)置,第三方,自定義)
import re
import random

import requests
from openpyxl import load_workbook


# 3.全局變量大寫
DB = "XXX"

# 4.函數(shù)名規(guī)范,函數(shù)功能注釋
def do_something():
    """ 函數(shù)注釋 """

    # TODO # 5.待完成時(shí),下一期實(shí)現(xiàn)xxx功能
    for i in range(10):
        pass


def run():
    """ 函數(shù)注釋 """

    # 對(duì)功能代碼進(jìn)行注釋  # 6.部分功能代碼注釋
    text = input(">>>")
    print(text)

# 7.主文件
if __name__ == '__main__':
    run()

2. 單可執(zhí)行文件

新創(chuàng)建一個(gè)項(xiàng)目,假設(shè)名字叫 【crm】,可以創(chuàng)建如下文件和文件夾來(lái)存放代碼和數(shù)據(jù)。

crm
├── app.py        文件,程序的主文件(盡量精簡(jiǎn))
├── config.py     文件,配置文件(放相關(guān)配置信息,代碼中讀取配置信息,如果想要修改配置,即可以在此修改,不用再去代碼中逐一修改了)
├── db            文件夾,存放數(shù)據(jù)
├── files         文件夾,存放文件
├── src           包,業(yè)務(wù)處理的代碼
└── utils         包,公共功能

3. 多可執(zhí)行文件

新創(chuàng)建項(xiàng)目,假設(shè)名稱叫【killer】,可以創(chuàng)建如下文件和文件夾來(lái)存放代碼和數(shù)據(jù)。

killer
├── bin     文件夾,存放多個(gè)主文件(可運(yùn)行)
│   ├── app1.py
│   └── app2.py
├── config              包,配置文件
│   ├── __init__.py
│   └── settings.py
├── db                  文件夾,存放數(shù)據(jù)
├── files               文件夾,存放文件
├── src                 包,業(yè)務(wù)代碼
│   └── __init__.py
└── utils               包,公共功能
    └── __init__.py

4. 項(xiàng)目結(jié)構(gòu)

設(shè)計(jì)項(xiàng)目目錄結(jié)構(gòu)的作用:

  • 可讀性高: 不熟悉這個(gè)項(xiàng)目代碼的人,一眼就能看懂目錄結(jié)構(gòu),知道程序啟動(dòng)腳本是哪個(gè),測(cè)試目錄在哪兒,配置文件在哪兒等等。從而非常快速的了解這個(gè)項(xiàng)目。
  • 可維護(hù)性高: 定義好組織規(guī)則后,維護(hù)者就能很明確地知道,新增的哪個(gè)文件和代碼應(yīng)該放在什么目錄之下。這個(gè)好處是,隨著時(shí)間的推移,代碼/配置的規(guī)模增加,項(xiàng)目結(jié)構(gòu)不會(huì)混亂,仍然能夠組織良好。

較好的目錄結(jié)構(gòu)方式(推薦)

  • bin是一個(gè)存放啟動(dòng)文件的目錄,不管你文件的名字叫什么你只要放到bin目錄下大家就知道這是一個(gè)啟動(dòng)文件:
#===============>start.py
# 開(kāi)啟項(xiàng)目的start文件。
import sys,os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from core import src
if __name__ == '__main__':
    src.run()
  • cores是一個(gè)存放項(xiàng)目的主邏輯,比如購(gòu)物車,里邊寫的就是登陸充值購(gòu)買等功能;
#===============>src.py
# 主要邏輯部分:
# 核心邏輯,代碼放在這。
from conf import settings
from lib import common
import time
logger=common.get_logger(__name__)
current_user={'user':None,'login_time':None,'timeout':int(settings.LOGIN_TIMEOUT)}
def auth(func):
    def wrapper(*args,**kwargs):
        pass
    return wrapper
@auth
def buy():
    print('buy...')
@auth
def run():
    print('''
購(gòu)物
查看余額
轉(zhuǎn)賬
  • lib是存放有一個(gè)公共組件的目錄,什么是公共組件,就是在這個(gè)項(xiàng)目中陪別的功能頻繁使用的功能;
#===============>common.py
# 公共組件放在這里:公共功能部分。
from conf import settings
import logging
import logging.config
import json
def get_logger(name):
    logging.config.dictConfig(settings.LOGGING_DIC)  # 導(dǎo)入上面定義的logging配置
    logger = logging.getLogger(name)  # 生成一個(gè)log實(shí)例
    return logger
def conn_db():
    db_path=settings.DB_PATH
    dic=json.load(open(db_path,'r',encoding='utf-8'))
    return dic
  • conf 是一個(gè)存放配置文件的目錄,配置文件就是文件中的一些全局變量移到這里;
#===============>settings.py
# 配置文件,放一些路徑或者信息等配置
import os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DB_PATH=os.path.join(BASE_DIR,'db','db.json')
LOG_PATH=os.path.join(BASE_DIR,'log','access.log')
LOGIN_TIMEOUT=5
  • db是存放這個(gè)項(xiàng)目需要使用到的一些文件;
// ===============>db.json
// 重要數(shù)據(jù)放在這里
{
    "students":[
        {"name":"lisa","age":18},
        {"name":"jack","age":18},
        //  ...
    ]
}
  • log是這個(gè)項(xiàng)目需要記錄的日志文件存放位置;
"""
logging配置
"""
# 定義三種日志輸出格式
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]' #其中name為getlogger指定的名字
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# log配置字典
LOGGING_DIC = {
    # xxx
}

5. 關(guān)于README的內(nèi)容

每個(gè)項(xiàng)目都應(yīng)該有的一個(gè)文件,目的是能簡(jiǎn)要描述該項(xiàng)目的信息,讓讀者快速了解這個(gè)項(xiàng)目。它需要說(shuō)明以下幾個(gè)事項(xiàng):

  • 軟件定位,軟件的基本功能。
  • 運(yùn)行代碼的方法: 安裝環(huán)境、啟動(dòng)命令等。
  • 簡(jiǎn)要的使用說(shuō)明。
  • 代碼目錄結(jié)構(gòu)說(shuō)明,更詳細(xì)點(diǎn)可以說(shuō)明軟件的基本原理。
  • 常見(jiàn)問(wèn)題說(shuō)明。

五、總結(jié)

模塊化開(kāi)發(fā)是Python編程中的一個(gè)重要實(shí)踐。通過(guò)將代碼分解為獨(dú)立的模塊,我們可以更好地管理、組織和復(fù)用代碼。模塊化開(kāi)發(fā)使得我們的項(xiàng)目更易于擴(kuò)展、維護(hù)和測(cè)試,并且還可以加速開(kāi)發(fā)過(guò)程。在實(shí)際應(yīng)用中,我們可以采用各種技術(shù)和工具來(lái)實(shí)現(xiàn)模塊化開(kāi)發(fā),如使用Python的內(nèi)置模塊、第三方庫(kù)、包管理工具等。通過(guò)運(yùn)用模塊化開(kāi)發(fā)的原則和技巧,我們能夠編寫出結(jié)構(gòu)清晰、易于理解和更具可持續(xù)性的Python代碼。

責(zé)任編輯:趙寧寧 來(lái)源: python學(xué)習(xí)之旅
相關(guān)推薦

2023-10-17 09:19:34

開(kāi)發(fā)Java

2018-11-08 15:50:18

前端Javascript重用性

2023-06-15 09:02:14

Python模塊和包

2013-03-11 10:00:13

前端模塊化

2024-01-03 08:00:00

Java軟件開(kāi)發(fā)代碼

2011-07-21 13:24:14

java

2013-03-11 10:10:03

2013-04-15 09:02:43

JavaScriptJS

2024-04-18 14:19:39

UPS系統(tǒng)模塊化數(shù)據(jù)中心

2021-08-08 08:23:45

SQL代碼編程

2025-01-27 00:48:12

Java 8代碼接口

2025-03-26 03:20:00

2013-08-20 16:33:52

前端模塊化

2010-08-02 09:21:48

Flex模塊化

2014-04-22 10:19:40

objection模塊化開(kāi)發(fā)iOS

2023-01-27 14:53:03

2020-06-02 09:06:31

VueTransition前端

2024-06-13 10:11:33

WPFCommand命令模式

2010-03-18 14:57:59

VSTS 2010

2017-05-12 14:00:07

大數(shù)據(jù)前端模塊化開(kāi)發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 成人18亚洲xxoo | 国产精品一区二区福利视频 | 国产精品1区2区 | 狠狠色综合久久婷婷 | 久久久久久久一级 | 国产av毛片| 午夜影晥 | 欧美精品在线免费观看 | 亚洲一区日韩 | 欧美伊人久久久久久久久影院 | 国产在线一区二区 | 久久久国产一区二区三区 | 中文字幕国产视频 | 综合婷婷 | 欧美日韩久久精品 | 国外成人在线视频网站 | 一区视频在线 | 二区在线观看 | 婷婷亚洲综合 | 亚洲欧美日韩电影 | www.天天操.com | 日本精品视频 | 欧美久久久久久久久中文字幕 | 网站黄色av | 亚洲精品久久久久久国产精华液 | 免费黄色的视频 | 欧美日韩一区二区三区视频 | 青青草一区二区 | 国产精品日韩在线观看一区二区 | 秋霞在线一区二区 | 请别相信他免费喜剧电影在线观看 | 久久综合狠狠综合久久综合88 | 中文字幕在线观看一区 | 美女国产精品 | 欧美啪啪| 国产精品无码专区在线观看 | 国产精品免费在线 | www国产成人免费观看视频,深夜成人网 | 欧美黄色片 | 久久久精品影院 | 欧美激情亚洲天堂 |