精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Python可復用函數的六種最佳實踐

開發 前端
在編寫Python函數時,你不需要記住所有這些最佳實踐。衡量一個Python函數質量的一個很好的指標是它的可測試性。如果一個函數可以很容易地被測試,這表明該函數是模塊化的,執行單一的任務,并且沒有重復的代碼。

對于在一個有各種角色的團隊中工作的數據科學家來說,編寫干凈的代碼是一項必備的技能,因為:

  • 清晰的代碼增強了可讀性,使團隊成員更容易理解和貢獻于代碼庫。
  • 清晰的代碼提高了可維護性,簡化了調試、修改和擴展現有代碼等任務。

為了實現可維護性,我們的Python函數應該:

  • 小型
  • 只做一項任務
  • 沒有重復
  • 有一個層次的抽象性
  • 有一個描述性的名字
  • 有少于四個參數

我們先來看看下面的 get_data 函數。

import xml.etree.ElementTree as ET
import zipfile
from pathlib import Path
import gdown

def get_data(
    url: str,
    zip_path: str,
    raw_train_path: str,
    raw_test_path: str,
    processed_train_path: str,
    processed_test_path: str,
):
    # Download data from Google Drive
    zip_path = "Twitter.zip"
    gdown.download(url, zip_path, quiet=False)

    # Unzip data
    with zipfile.ZipFile(zip_path, "r") as zip_ref:
        zip_ref.extractall(".")

    # Extract texts from files in the train directory
    t_train = []
    for file_path in Path(raw_train_path).glob("*.xml"):
        list_train_doc_1 = [r.text for r in ET.parse(file_path).getroot()[0]]
        train_doc_1 = " ".join(t for t in list_train_doc_1)
        t_train.append(train_doc_1)
    t_train_docs = " ".join(t_train)

    # Extract texts from files in the test directory
    t_test = []
    for file_path in Path(raw_test_path).glob("*.xml"):
        list_test_doc_1 = [r.text for r in ET.parse(file_path).getroot()[0]]
        test_doc_1 = " ".join(t for t in list_test_doc_1)
        t_test.append(test_doc_1)
    t_test_docs = " ".join(t_test)

    # Write processed data to a train file
    with open(processed_train_path, "w") as f:
        f.write(t_train_docs)

    # Write processed data to a test file
    with open(processed_test_path, "w") as f:
        f.write(t_test_docs)


if __name__ == "__main__":
    get_data(
        url="https://drive.google.com/uc?id=1jI1cmxqnwsmC-vbl8dNY6b4aNBtBbKy3",
        zip_path="Twitter.zip",
        raw_train_path="Data/train/en",
        raw_test_path="Data/test/en",
        processed_train_path="Data/train/en.txt",
        processed_test_path="Data/test/en.txt",
    )

盡管在這個函數中有許多注釋,但很難理解這個函數的作用,因為:

  • 該函數很長。
  • 該函數試圖完成多項任務。
  • 函數內的代碼處于不同的抽象層次。
  • 該函數有許多參數。
  • 有多個代碼重復。
  • 該函數缺少一個描述性的名稱。

我們將通過使用文章開頭提到的六種做法來重構這段代碼。

小型

一個函數應該保持很小,以提高其可讀性。理想情況下,一個函數的代碼不應超過20行。此外,一個函數的縮進程度不應超過1或2。

import zipfile
import gdown

def get_raw_data(url: str, zip_path: str) -> None:
    gdown.download(url, zip_path, quiet=False)
    with zipfile.ZipFile(zip_path, "r") as zip_ref:
        zip_ref.extractall(".")

只做一個任務

函數應該有一個單一的重點,并執行單一的任務。函數get_data試圖完成多項任務,包括從Google Drive檢索數據,執行文本提取,并保存提取的文本。

因此,這個函數應該被分成幾個小的函數,如下圖所示:

def main(
    url: str,
    zip_path: str,
    raw_train_path: str,
    raw_test_path: str,
    processed_train_path: str,
    processed_test_path: str,
) -> None:
    get_raw_data(url, zip_path)
    t_train, t_test = get_train_test_docs(raw_train_path, raw_test_path)
    save_train_test_docs(processed_train_path, processed_test_path, t_train, t_test)

這些功能中的每一個都應該有一個單一的目的:

def get_raw_data(url: str, zip_path: str) -> None:
    gdown.download(url, zip_path, quiet=False)
    with zipfile.ZipFile(zip_path, "r") as zip_ref:
        zip_ref.extractall(".")

函數get_raw_data只執行一個動作,那就是獲取原始數據。

重復性

我們應該避免重復,因為:

  • 重復的代碼削弱了代碼的可讀性。
  • 重復的代碼使代碼修改更加復雜。如果需要修改,需要在多個地方進行修改,增加了出錯的可能性。

下面的代碼包含重復的內容,用于檢索訓練和測試數據的代碼幾乎是相同的。

from pathlib import Path  

 # 從train目錄下的文件中提取文本
t_train = []
for file_path in Path(raw_train_path).glob("*.xml"):
    list_train_doc_1 = [r.text for r in ET.parse(file_path).getroot()[0]]
    train_doc_1 = " ".join(t for t in list_train_doc_1)
    t_train.append(train_doc_1)
t_train_docs = " ".join(t_train)

# 從測試目錄的文件中提取文本
t_test = []
for file_path in Path(raw_test_path).glob("*.xml"):
    list_test_doc_1 = [r.text for r in ET.parse(file_path).getroot()[0]]
    test_doc_1 = " ".join(t for t in list_test_doc_1)
    t_test.append(test_doc_1)
t_test_docs = " ".join(t_test)

我們可以通過將重復的代碼合并到一個名為extract_texts_from_multiple_files的單一函數中來消除重復,該函數從指定位置的多個文件中提取文本。

def extract_texts_from_multiple_files(folder_path) -> str:

all_docs = []
for file_path in Path(folder_path).glob("*.xml"):
    list_of_text_in_one_file = [r.text for r in ET.parse(file_path).getroot()[0]]
    text_in_one_file = " ".join(list_of_text_in_one_file)
    all_docs.append(text_in_one_file)

return " ".join(all_docs)

現在你可以使用這個功能從不同的地方提取文本,而不需要重復編碼。

t_train = extract_texts_from_multiple_files(raw_train_path)
t_test  = extract_texts_from_multiple_files(raw_test_path)

一個層次的抽象

抽象水平是指一個系統的復雜程度。高層次指的是對系統更概括的看法,而低層次指的是系統更具體的方面。

在一個代碼段內保持相同的抽象水平是一個很好的做法,使代碼更容易理解。

以下函數證明了這一點:

def extract_texts_from_multiple_files(folder_path) -> str:

    all_docs = []
    for file_path in Path(folder_path).glob("*.xml"):
        list_of_text_in_one_file = [r.text for r in ET.parse(file_path).getroot()[0]]
        text_in_one_file = " ".join(list_of_text_in_one_file)
        all_docs.append(text_in_one_file)

    return " ".join(all_docs)

該函數本身處于較高層次,但 for 循環內的代碼涉及與XML解析、文本提取和字符串操作有關的較低層次的操作。

為了解決這種抽象層次的混合,我們可以將低層次的操作封裝在extract_texts_from_each_file函數中:

def extract_texts_from_multiple_files(folder_path: str) -> str:
    all_docs = []
    for file_path in Path(folder_path).glob("*.xml"):
        text_in_one_file = extract_texts_from_each_file(file_path)
        all_docs.append(text_in_one_file)

    return " ".join(all_docs)
    

def extract_texts_from_each_file(file_path: str) -> str:
    list_of_text_in_one_file = [r.text for r in ET.parse(file_path).getroot()[0]]
    return " ".join(list_of_text_in_one_file)

這為文本提取過程引入了更高層次的抽象,使代碼更具可讀性。

描述性的名稱

一個函數的名字應該有足夠的描述性,使用戶不用閱讀代碼就能理解其目的。長一點的、描述性的名字比模糊的名字要好。例如,命名一個函數get_texts就不如命名為extract_texts_from_multiple_files來得清楚。

然而,如果一個函數的名字變得太長,比如retrieve_data_extract_text_and_save_data,這說明這個函數可能做了太多的事情,應該拆分成更小的函數。

少于四個參數

隨著函數參數數量的增加,跟蹤眾多參數之間的順序、目的和關系變得更加復雜。這使得開發人員難以理解和使用該函數。

def main(
    url: str,
    zip_path: str,
    raw_train_path: str,
    raw_test_path: str,
    processed_train_path: str,
    processed_test_path: str,
) -> None:
    get_raw_data(url, zip_path)
    t_train, t_test = get_train_test_docs(raw_train_path, raw_test_path)
    save_train_test_docs(processed_train_path, processed_test_path, t_train, t_test)

為了提高代碼的可讀性,你可以用數據類或Pydantic模型將多個相關參數封裝在一個數據結構中。

from pydantic import BaseModel

class RawLocation(BaseModel):
    url: str
    zip_path: str
    path_train: str
    path_test: str


class ProcessedLocation(BaseModel):
    path_train: str
    path_test: str


def main(raw_location: RawLocation, processed_location: ProcessedLocation) -> None:
    get_raw_data(raw_location)
    t_train, t_test = get_train_test_docs(raw_location)
    save_train_test_docs(processed_location, t_train, t_test)

我如何寫這樣的函數?

在編寫Python函數時,你不需要記住所有這些最佳實踐。衡量一個Python函數質量的一個很好的指標是它的可測試性。如果一個函數可以很容易地被測試,這表明該函數是模塊化的,執行單一的任務,并且沒有重復的代碼。

def save_data(processed_path: str, processed_data: str) -> None:
    with open(processed_path, "w") as f:
        f.write(processed_data)


def test_save_data(tmp_path):
    processed_path = tmp_path / "processed_data.txt"
    processed_data = "Sample processed data"

    save_data(processed_path, processed_data)

    assert processed_path.exists()
    assert processed_path.read_text() == processed_data

參考文獻 Martin, R. C. (2009).Clean code:A handbook of agile software craftsmanship.Upper Saddle River:Prentice Hall.

責任編輯:武曉燕 來源: 數據STUDIO
相關推薦

2016-07-08 15:02:47

云計算

2021-07-28 13:23:32

CICD管道安全漏洞

2013-08-26 10:22:22

Linux桌面

2017-06-26 10:35:58

前端JavaScript繼承方式

2021-07-29 09:00:00

Python工具機器學習

2018-04-27 15:02:10

2011-02-24 10:56:34

人才

2022-05-12 09:02:50

編程語言PythonJava

2022-12-06 10:39:43

Spring事務失效

2019-05-16 13:00:18

異步編程JavaScript回調函數

2025-05-06 00:00:05

MySQLES協同

2025-05-19 00:02:00

數據脫敏加密算法數據庫

2023-09-06 11:35:11

2022-05-08 22:09:28

網絡拓撲網絡技術網絡

2011-06-07 09:36:18

2016-01-15 17:36:29

云計算云應用

2012-10-15 13:26:31

云計算架構

2025-02-27 00:00:30

SpringJava方式

2024-11-20 15:24:49

2019-01-17 10:58:52

JS異步編程前端
點贊
收藏

51CTO技術棧公眾號

日本高清视频免费观看| 午夜爱爱毛片xxxx视频免费看| 男人的天堂免费在线视频| 久久久久一区二区三区四区| 国产欧美精品xxxx另类| 劲爆欧美第一页| 最新亚洲精品| 日韩无一区二区| www.亚洲天堂网| 成人看片免费| 久久精品一区二区三区不卡牛牛| 亚洲aa中文字幕| 男人天堂2024| 欧美黄色aaaa| 在线电影av不卡网址| 中文字幕1区2区| 国产香蕉久久| 欧美日韩免费观看中文| 在线视频欧美一区| 婷婷色在线视频| 国产精品一区2区| 国产suv精品一区二区| 精品一级少妇久久久久久久| 欧美天天综合| 日韩高清有码在线| 成年人看片网站| 日韩精品第二页| 色综合视频一区二区三区高清| 国产精品国三级国产av| 免费看a在线观看| 国产人成亚洲第一网站在线播放| 国产精品夜夜夜一区二区三区尤| 96亚洲精品久久久蜜桃| 久久综合五月| 91成人国产在线观看| 欧美日韩一级大片| 国产精品久久久乱弄| 亚洲色图av在线| 日本丰满少妇裸体自慰| jizz国产精品| 日韩欧美你懂的| 伊人五月天婷婷| 免费成人毛片| 欧美日韩视频专区在线播放| 欧美日韩黄色一级片| h片在线观看视频免费免费| 亚洲激情网站免费观看| 最新不卡av| 爆操欧美美女| 亚洲女同一区二区| 中文字幕第50页| 中文字幕在线观看播放| 悠悠色在线精品| 久久久久久av无码免费网站下载| 欧美另类极品| 成人欧美一区二区三区小说| 中文字幕中文字幕在线中心一区| 日韩在线观看www| 欧美国产激情一区二区三区蜜月| 日韩av高清| 自拍视频在线| 亚洲女爱视频在线| 色哺乳xxxxhd奶水米仓惠香| 羞羞电影在线观看www| 一区二区三区波多野结衣在线观看| 秋霞在线一区二区| 欧美性猛片xxxxx免费中国| 亚洲一区二区五区| 日本一道本久久| 欧美国产大片| 欧美日韩免费视频| a级大片免费看| 激情小说亚洲色图| 亚洲色图五月天| 很污很黄的网站| 欧美日一区二区在线观看| 午夜精品久久久久久久久久久久| 亚欧视频在线观看| 热久久国产精品| 亚洲a在线播放| 天天综合网在线观看| 国产日产精品1区| 欧美日韩视频免费在线观看| 欧美人与性动交α欧美精品济南到 | 国模精品视频一区二区| 91浏览器在线观看| 日本成人在线电影网| 亚洲自拍偷拍福利| 无码国产精品一区二区色情男同| 欧美国产一区二区在线观看| 蜜臀av性久久久久蜜臀av| 蜜桃视频动漫在线播放| 精品视频资源站| 国产91在线免费观看| 偷窥自拍亚洲色图精选| 插插插亚洲综合网| 国语对白永久免费| 国产在线精品一区二区三区不卡 | 一区二区三区免费看视频| 亚洲熟妇国产熟妇肥婆| 中文字幕成人| 亚洲美女在线看| 澳门黄色一级片| 久久精品盗摄| 国产精品区一区二区三含羞草| 久久精品国产亚洲a∨麻豆| 亚洲免费观看在线观看| 日韩av三级在线| 国产午夜亚洲精品一级在线| 亚洲欧洲一区二区三区在线观看 | 男人天堂久久久| 岛国视频午夜一区免费在线观看| 欧美丝袜在线观看| 欧美精品尤物在线观看| 高清欧美性猛交xxxx黑人猛交| 真实的国产乱xxxx在线91| 成人a区在线观看| 宅男在线精品国产免费观看| 成人片免费看| 亚洲精品久久久久国产| 欧美日韩大片在线观看| 久草在线在线精品观看| 日本在线一区| gay欧美网站| 欧美精品一区二区三区在线| 乱h高h女3p含苞待放| 日韩一区精品视频| 久久天天狠狠| 麻豆视频在线看| 亚洲第一区中文字幕| 激情综合五月网| 国产一区二区三区免费播放| 亚洲一区二区精品在线| 日韩av免费| 亚洲色图国产精品| www.国产一区二区| 久久蜜桃香蕉精品一区二区三区| 久久久久久久中文| 欧美日韩麻豆| 欧美亚洲国产日本| 无码国产精品一区二区色情男同 | 久久精品夜色噜噜亚洲a∨| 黄色成人在线看| 任你弄精品视频免费观看| 久久久久久亚洲精品不卡| 亚洲AV无码国产精品午夜字幕| 亚洲欧美日韩在线不卡| 奇米777在线视频| 亚洲一区色图| 91精品国自产在线观看 | 亚洲女爱视频在线| 好吊操视频这里只有精品| 激情婷婷亚洲| 国产在线精品一区二区中文| 色是在线视频| 国产亚洲视频在线观看| 亚洲免费视频二区| 中文字幕一区二区三区在线不卡 | 亚洲欧美一区二区视频| 手机精品视频在线| 国内激情久久| 九九热久久66| 日本一区二区电影| 久久精品男人天堂| 99久久精品国产一区色| 一区二区三区波多野结衣在线观看| 99久久久无码国产精品性波多| 尤物网精品视频| 日本精品一区二区三区不卡无字幕| 日韩欧美另类一区二区| 中文字幕欧美精品在线| 国产裸体无遮挡| 香蕉乱码成人久久天堂爱免费| 免费成人深夜夜行p站| 日韩激情视频在线观看| 在线观看成人av电影| 日韩精品一区二区三区中文| 久久久噜噜噜久久| 国产精品四虎| 日韩欧美国产三级电影视频| 日本网站免费观看| 国产日产亚洲精品系列| 9191在线视频| 久久精品一区二区三区中文字幕| 亚洲乱码一区二区三区三上悠亚 | 另类的小说在线视频另类成人小视频在线 | 亚洲精品第1页| www.超碰97| 久久99精品国产麻豆婷婷| 亚洲精品蜜桃久久久久久| 美女毛片一区二区三区四区最新中文字幕亚洲| 国产精品一区=区| 国产99re66在线视频| 在线视频欧美日韩| 欧美自拍偷拍第一页| 蜜桃视频在线观看一区| 亚洲一卡二卡区| 你懂的在线观看一区二区| 国产精品久久久久久搜索| 人交獸av完整版在线观看| 亚洲香蕉在线观看| 后入内射欧美99二区视频 | a在线观看视频| 色综合久久久久综合体桃花网| 免费在线观看一级片| 国产亚洲欧美日韩在线一区| 亚洲国产综合av| 日本欧美一区二区三区乱码| 91免费黄视频| 久久久久久免费视频| 欧美午夜精品理论片a级大开眼界| 日韩欧美激情| 国产成一区二区| 草草影院在线| xvideos亚洲| 国产美女视频一区二区三区 | 国产男女猛烈无遮挡91| 欧产日产国产精品视频 | 久久uomeier| 性欧美长视频免费观看不卡| 免费日本一区二区三区视频| 国产午夜精品全部视频在线播放| 五月婷婷伊人网| 欧美v国产在线一区二区三区| 中文字幕制服诱惑| 色婷婷精品大视频在线蜜桃视频| 国产精品自拍视频一区| 一区二区三区欧美亚洲| 国产精品国产三级国产传播| 中文字幕精品一区二区精品绿巨人| 国产老熟女伦老熟妇露脸| 国产成人午夜片在线观看高清观看| 国产一区二区在线免费播放| 天堂成人免费av电影一区| 少妇高潮喷水在线观看| 精品成人国产| 妺妺窝人体色777777| 国产在线成人| 欧美日韩福利在线| 亚洲激情婷婷| 亚洲国产精品无码av| 国一区二区在线观看| 久久男人资源站| 亚洲先锋成人| 黄色一级片在线看| 99国产成+人+综合+亚洲欧美| 国产va亚洲va在线va| 亚洲国产综合在线看不卡| 草b视频在线观看| 亚洲大片在线| 香港三级韩国三级日本三级| 亚洲啪啪91| 国产精品丝袜久久久久久消防器材| 日韩五码在线| 国产av国片精品| 国产精品嫩草99av在线| 日韩欧美精品在线观看视频| 丝袜美腿高跟呻吟高潮一区| 美女一区二区三区视频| 日本不卡123| 欧美性受xxxxxx黑人xyx性爽| 精品亚洲porn| 精品伦一区二区三区| 99riav久久精品riav| 日本xxx在线播放| 欧美国产97人人爽人人喊| 国产美女高潮视频| 亚洲国产三级在线| 波多野结衣啪啪| 欧美日韩视频在线一区二区| 国产成人精品免费看视频| 亚洲成人av中文字幕| 日韩美女一级视频| 色诱女教师一区二区三区| 伊人222成人综合网| 欧美性视频在线| 精品九九久久| 国产精品一区二区三区免费| 亚洲另类春色校园小说| 夜夜爽99久久国产综合精品女不卡| 自拍偷拍欧美| 午夜肉伦伦影院| 精品在线视频一区| 日本三级日本三级日本三级极| 国产亚洲一区字幕| 91porn在线视频| 日韩欧美在线视频观看| 国产有码在线观看| 欧美r级电影在线观看| 国产中文字幕在线看| 精品国内亚洲在观看18黄 | 欧美视频中文在线看| 中文字幕在线一| 日韩福利在线播放| 超碰公开在线| 国产精品欧美激情在线播放| 一区二区免费| 亚洲欧美电影在线观看| 亚洲国产日韩在线| 爽爽爽在线观看| 91麻豆蜜桃一区二区三区| www.毛片com| 色婷婷国产精品久久包臀 | 少妇精品视频在线观看| 精品综合久久久| 亚洲欧洲日韩| 亚洲狼人综合干| 成人h动漫精品| 91麻豆精品成人一区二区| 色婷婷亚洲婷婷| 色哟哟中文字幕| 欧美猛少妇色xxxxx| av在线不卡精品| 精品国产免费久久久久久尖叫| 亚洲电影影音先锋| 中文字幕国产传媒| 久久这里只有精品首页| 精品人妻在线播放| 日韩午夜在线播放| 快射av在线播放一区| 国产精品99久久久久久白浆小说| 精品资源在线| 亚洲国产精品无码av| 国产mv日韩mv欧美| 久久免费看少妇高潮v片特黄 | 热久久免费视频精品| 精品精品精品| 成人免费看片'免费看| 国产精品99久久久久久久女警| 国产又粗又猛又爽又黄的视频小说| 欧美色播在线播放| 四虎电影院在线观看| 韩国三级电影久久久久久| 亚洲日本一区二区三区在线| 热这里只有精品| 国产一区二区三区在线观看免费视频| 午夜时刻免费入口| 欧美性色视频在线| 四虎影视在线播放| 欧美中文在线观看国产| 日韩啪啪网站| 2022亚洲天堂| 久久综合色8888| 懂色av蜜臀av粉嫩av分享吧最新章节| 国产婷婷色综合av蜜臀av| 亚洲精品福利电影| 日本不卡免费新一二三区| 日韩一区精品字幕| 国产一二三av| 7777精品伊人久久久大香线蕉 | 欧美香蕉大胸在线视频观看| 国产精品国产高清国产| 欧美中文字幕在线视频| 视频国产一区| 91热这里只有精品| 国产精品免费视频一区| 国产精品热久久| 久久黄色av网站| 91精品短视频| 精品中文字幕av| 中日韩av电影| 国产wwwwwww| 国产最新精品视频| 久久av免费看| 五月天婷婷亚洲| 亚洲综合999| 瑟瑟在线观看| 国产欧美日韩专区发布| 亚洲综合小说| 菠萝菠萝蜜网站| 欧洲国内综合视频| 爆操欧美美女| 久久伦理网站| 国产最新精品精品你懂的| 久久久久人妻一区精品色欧美| 日韩精品免费在线视频| 国产69精品久久| 日韩小视频网站| 欧美激情一二三区| 性欧美一区二区三区| 欧美综合第一页| 国产精品99久久精品| 理论片大全免费理伦片| 欧美亚洲尤物久久| 在线看女人毛片| 欧美一区二区三区成人久久片| 精品一区精品二区高清| 天天操天天干视频| 久久久99免费视频| 日韩三级av| 伊人成人免费视频| 一本大道久久a久久精品综合| 国产精品扒开做爽爽爽的视频| 久久精品magnetxturnbtih| 久久国产综合精品| 日本va欧美va国产激情| 久久精品成人动漫| 妖精一区二区三区精品视频 | 国产视频在线视频| 亚洲午夜成aⅴ人片|