精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产精品一区二区精品视频观看| 亚洲美女综合网| 日韩av自拍| 欧美一区二区三区在线视频| 日韩一二区视频| av女名字大全列表| 久久99精品久久久久婷婷| 久久久久久久国产精品视频| 偷拍夫妻性生活| 91精品亚洲一区在线观看| 午夜在线电影亚洲一区| 亚洲欧洲精品在线观看| 手机看片一区二区三区| 久久国内精品自在自线400部| 欧美日韩国产123| 免费看91的网站| 精品欧美午夜寂寞影院| 欧美久久一区二区| 激情网站五月天| 国产又色又爽又黄刺激在线视频| 久久久久国产精品人| 亚洲字幕一区二区| 亚洲av无码乱码国产精品fc2| 亚洲一级二级| 欧美xxxx做受欧美| 国产欧美小视频| 日韩精选在线| 日韩情涩欧美日韩视频| 日韩成人精品视频在线观看| 向日葵视频成人app网址| 亚洲国产日韩在线一区模特| 免费成人深夜夜行网站视频| 高清日韩av电影| 91美女视频网站| 国产不卡一区二区三区在线观看| 一级做a爱片性色毛片| 视频一区视频二区中文字幕| 国内精品一区二区三区| 美女福利视频在线观看| 国产高清久久| 日韩中文娱乐网| 无码人妻丰满熟妇啪啪欧美| 欧美综合精品| 亚洲国产日韩欧美在线动漫| 欧美日韩一区二区区别是什么| 亚洲伦理一区二区| 欧美在线免费视屏| 久久久久久香蕉| 国产精品成人v| 波多野吉衣中文字幕| 韩国女主播一区二区三区| 日韩精品中午字幕| 久久久久亚洲av无码麻豆| 国产精品视频一区二区三区| 欧美福利一区二区| 亚欧精品在线视频| 日韩成人在线看| 精品久久久久久无| 中国xxxx性xxxx产国| 国内精品国产成人国产三级粉色| 精品国产乱码久久久久久久| 少妇一级淫免费观看| 欧美18免费视频| 日韩精品在线看| 精品欧美一区二区久久久| 国内亚洲精品| 日韩在线欧美在线| 黄色一级片中国| 国模 一区 二区 三区| 久久久久国产视频| 天天综合网入口| 久久久久国产精品午夜一区| 国产成人精品电影| 一级黄色片在线观看| 国产精品一卡二卡| 国产一区二区免费电影| 欧美777四色影视在线| 中文字幕av一区二区三区高| 国产日韩视频在线播放| 欧美黑人猛交的在线视频| 精品国产户外野外| 黄色三级视频在线| 亚洲不卡在线| 精品小视频在线| 羞羞在线观看视频| 精品福利电影| 国产成人一区二区三区小说 | 无码精品视频一区二区三区| 久久久欧美精品sm网站| 亚洲精品国产精品国自产观看| а√天堂资源地址在线下载| 亚洲超碰精品一区二区| 丁香婷婷激情网| 在线日韩成人| 亚洲日本欧美中文幕| 极品久久久久久| 香蕉亚洲视频| 91久久精品国产91久久性色| 手机av免费在线观看| 国产精品久久久久久久久免费相片| 日韩中文字幕亚洲精品欧美| 美女18一级毛片一品久道久久综合| 欧美日本韩国一区| 亚洲综合自拍网| 亚洲精品二区三区| 国产成人精品在线播放| 丰满少妇高潮在线观看| 国产三级一区二区三区| 免费不卡av在线| 欧美一区二区三区婷婷| 日韩电影中文字幕在线| 1024手机在线视频| 美日韩一区二区| 欧美一区少妇| xxxx另类黑人| 欧美一区二区人人喊爽| 三年中国中文观看免费播放| 亚洲乱亚洲高清| 亚洲一区二区久久久久久久| 黄色在线小视频| 亚洲成av人影院| 日本高清免费在线视频| 亚洲精品视频网| 99精品一区| 国产精品第10页| 天堂在线中文| 亚洲午夜久久久久久久久电影网| 日本特黄a级片| 美女久久久久| 97在线视频一区| 成人爽a毛片一区二区| 成人欧美一区二区三区| 天天爽夜夜爽一区二区三区 | 日韩福利二区| 亚洲一区资源| 日韩av在线免费观看一区| 妺妺窝人体色www在线下载| 激情文学综合插| 亚洲欧洲一区二区在线观看| 欧美性xxx| 亚洲欧洲在线看| 黄色片中文字幕| 91老师片黄在线观看| 日韩欧美国产综合在线| 国产精品久久久久av蜜臀| 欧美国产日产韩国视频| 亚洲美女性生活| 午夜影院久久久| 日韩精品人妻中文字幕有码| 尤物精品在线| 久久riav| 成人午夜精品| 日韩在线视频观看| 国产免费黄色网址| 亚洲精品大片www| 亚洲国产精品第一页| 亚洲性视频h| 精品国产乱码久久久久久郑州公司 | 三级做a全过程在线观看| 色综合久久综合| 国产精品密蕾丝袜| 免费欧美日韩国产三级电影| 亚洲一区bb| 免费一级欧美在线大片| 欧美国产在线电影| 亚洲欧美日韩成人在线| 在线视频欧美精品| xxxx日本少妇| 成人av综合一区| 日韩在线xxx| 欧美韩日一区| 99在线观看视频网站| 久久影院午夜精品| 亚洲图片在线综合| 国产又粗又猛又黄又爽无遮挡| 亚洲女同一区二区| 成人性生活免费看| 日本不卡123| 成年在线观看视频| 综合国产视频| 成人免费在线视频网址| 成人性生交大片免费看网站| 亚洲欧美成人一区二区在线电影| 91黄色在线视频| 午夜在线电影亚洲一区| 国产三级aaa| 成人av在线网| 国产91色在线观看| 最新日韩av| 亚洲精品影院| 国产精品香蕉国产| 国产乱码久久久久久| 99热这里都是精品| 中文字幕一区二区三区四区在线视频 | 久久久久成人精品无码中文字幕| 日韩精品高清不卡| 欧美一区二区三区综合| 你微笑时很美电视剧整集高清不卡| 国产夜色精品一区二区av| 97香蕉超级碰碰久久免费的优势| 天堂中文在线资| 欧美日本国产视频| 亚洲天堂一区在线观看| 一区二区三区四区不卡在线| 第一次破处视频| av在线不卡电影| 性欧美在线视频| 久久午夜影视| 欧美精品自拍视频| 最新国产精品| 亚洲国产日韩欧美| 免费视频国产一区| 国产精品日韩欧美一区二区三区| 日韩国产大片| 国产精品日韩精品| 依依综合在线| 韩国19禁主播vip福利视频| 嫩草在线视频| 亚洲美女自拍视频| 天天干天天色天天| 精品美女在线播放| 国产永久免费视频| 欧美性色黄大片| 在线观看日本网站| 亚洲h在线观看| 2021亚洲天堂| 自拍偷在线精品自拍偷无码专区| 亚洲天堂岛国片| 久久精品亚洲精品国产欧美kt∨ | 蜜臀久久99精品久久一区二区| 91九色蝌蚪嫩草| 国产一区二区三区视频在线| 99精品欧美一区二区三区小说| 国产精品久久久久久久免费大片| 99tv成人影院| 国产视频观看一区| 丁香婷婷久久| 国产精品久久久久久av福利软件| 成人免费影院| 中文字幕一区二区三区在线视频| 亚洲自拍小视频免费观看| 日韩欧国产精品一区综合无码| 91精品国产品国语在线不卡| 精品乱码一区二区三区| 欧美综合社区国产| 成人高清视频观看www| 精品176极品一区| 国产乱肥老妇国产一区二| 成人免费视频观看| 国产区亚洲区欧美区| 欧美videos粗暴| 国产日韩亚洲欧美| 精品国产亚洲一区二区三区| 91福利视频导航| 日韩有吗在线观看| 国产精品国产精品| 日本一区福利在线| 欧美午夜精品久久久久免费视| 奇米亚洲欧美| 一本一道久久久a久久久精品91| 日韩在线欧美| japanese在线播放| 亚洲麻豆av| 国产精品69页| 久久99精品视频| 国产高潮失禁喷水爽到抽搐| 成人国产精品免费网站| 久久精品国产亚洲av久| 国产精品看片你懂得| 久久久久亚洲av无码专区体验| 亚洲v日本v欧美v久久精品| 天堂中文在线网| 欧美精品一二三区| 亚洲精品人妻无码| 亚洲日本欧美中文幕| 免费黄色网页在线观看| 久久久久久久久久久免费精品| 久草在线资源福利站| 国产日韩在线视频| 国产女人18毛片水真多18精品| 日本一区二区三区www| 中文字幕av亚洲精品一部二部| 男人天堂手机在线视频| 视频一区二区三区入口| 国产又黄又嫩又滑又白| 26uuu色噜噜精品一区| 亚洲熟女毛茸茸| 欧美日韩免费区域视频在线观看| 美女黄页在线观看| 亚洲第五色综合网| 日韩免费网站| 97超级碰碰碰| avtt久久| 日韩成人在线资源| 国产精品豆花视频| 超碰在线播放91| www.日韩av| www.99re7| 在线免费观看日韩欧美| 午夜精品久久久久久久99热黄桃| 亚洲欧美国产精品va在线观看| 国产三区在线观看| 国产精品xxxxx| 久久人人爽人人爽人人片av不| 中文字幕欧美人与畜| 久久aⅴ国产紧身牛仔裤| 韩国三级与黑人| 国产精品国产自产拍在线| 毛片基地在线观看| 日韩精品一区二区三区swag| 日本黄色片在线观看| 日本aⅴ大伊香蕉精品视频| 成人盗摄视频| 在线视频一二三区| 麻豆精品在线播放| 精品人伦一区二区三电影| 午夜电影一区二区| 精品国产av一区二区三区| 日韩在线观看视频免费| 日本肉肉一区| 日本不卡在线播放| 美女精品在线| 国产制服丝袜在线| 亚洲成人免费电影| 性做久久久久久久| 欧美成人免费播放| 国产高清精品二区| 日本免费在线视频观看| 美国av一区二区| 久操视频在线观看免费| 91国偷自产一区二区三区观看 | 91蜜桃视频在线| 欧美videossex极品| 亚洲精品成人av| 欧美男人天堂| 久久久com| 久久久久久久波多野高潮日日| 女尊高h男高潮呻吟| 欧美性videos高清精品| 欧美婷婷久久五月精品三区| 91av视频在线播放| 一区二区美女| 免费国产成人av| 国产精品美女久久久久久久网站| 亚洲视屏在线观看| 色噜噜狠狠狠综合曰曰曰| 日本午夜精品久久久久| 一道本在线观看视频| 国产一级精品在线| 久久久久噜噜噜亚洲熟女综合| 精品奇米国产一区二区三区| 国产精品186在线观看在线播放| 官网99热精品| 中国女人久久久| 免费福利视频网站| 欧美日韩国产经典色站一区二区三区| 99视频在线观看地址| 成人国产精品免费视频| 你懂的国产精品| 国产女人18毛片水真多18| 粉嫩av一区二区三区免费野| 国产原创av在线| 91免费版网站入口| 精品91在线| 精品无码一区二区三区| 欧美日韩中文另类| 在线观看男女av免费网址| 国产精品青青草| 久久久精品午夜少妇| 国产麻豆视频在线观看| 亚洲精品一线二线三线| 亚洲第一会所| 麻豆视频传媒入口| 99精品视频一区| 艳妇乳肉豪妇荡乳av| 久久久久亚洲无码| 国产.欧美.日韩| 天天操天天干视频| 一区二区福利视频| 欧美一级片网址| 国产极品尤物在线| 欧美国产精品劲爆| 精品人妻无码一区二区三区蜜桃一| 国模私拍视频一区| 日韩国产专区| 好吊色视频一区二区三区| 欧洲视频一区二区| 午夜影院免费在线| 欧美一区1区三区3区公司 | 国产日韩欧美一区二区三区四区| 久久久人人人| 国产精品久久久久久久蜜臀| 一级特黄特色的免费大片视频| 欧美激情欧美激情| 激情五月色综合国产精品| 99精品999| 91黄色免费观看| 国产三线在线| 一区二区av| 91日韩在线专区|