一、說明
第 2 部分:介紹了依賴項(xiàng)管理和虛擬環(huán)境?!綪ython 程序設(shè)計(jì)】數(shù)據(jù)人員入門【02/8】
第 3 部分: 項(xiàng)目的最佳實(shí)踐,涵蓋了構(gòu)建項(xiàng)目的 9 個(gè)最佳實(shí)踐和示例?!綪ython程序設(shè)計(jì)】 項(xiàng)目的最佳實(shí)踐【03/8】
第 4 部分: Dagster 管道,我們探討了設(shè)置 Dagster 項(xiàng)目以及數(shù)據(jù)資產(chǎn)的關(guān)鍵概念?!綪ython程序設(shè)計(jì)】 從 Python 項(xiàng)目到 Dagster Pipelines【04/8】
第 5 部分:我們將介紹環(huán)境變量的重要性以及如何使用它們?!綪ython程序設(shè)計(jì)】Python 中的環(huán)境變量【05/8】
第 6 部分:類型提示,或類型提示如何減少錯(cuò)誤。
第7 部分:模式,或?qū)W習(xí)設(shè)計(jì)模式,它們是軟件設(shè)計(jì)中常見問題的可重用解決方案?!綪ython程序設(shè)計(jì)】 工廠模式【07/8】
?
????????Dagster運(yùn)行在Python上,大多數(shù)對(duì)Python有基本了解的數(shù)據(jù)工程師或開發(fā)人員都可以快速啟動(dòng)并運(yùn)行簡(jiǎn)單的管道。但是一些不太熟悉Python的用戶發(fā)現(xiàn)Python包有點(diǎn)令人頭疼。
????????因此,讓我們談?wù)勈裁词?Python 包以及如何使用它們。我們將介紹特定主題,這些主題將幫助你了解構(gòu)建 Python 項(xiàng)目所涉及的內(nèi)容,以及這如何轉(zhuǎn)換為更復(fù)雜的生成,例如數(shù)據(jù)管道和業(yè)務(wù)流程協(xié)調(diào)程序。在后面的文章中,我們將看到這些概念如何應(yīng)用于Dagster。
????????如果您只使用過現(xiàn)有的代碼庫或?Jupyter 筆記本,那么從頭開始打包代碼可能會(huì)讓人不知所措。什么是__init__.py
文件,何時(shí)應(yīng)使用它?什么是相對(duì)進(jìn)口與絕對(duì)進(jìn)口?讓我們潛入!?
二、什么是 Python 包?
????????我們將 Python 代碼放入包中,因?yàn)樗梢暂p松地在 Python 社區(qū)中共享和重用代碼。包只是文件和目錄的集合,其中包括我們稍后將檢查的代碼、文檔和其他必要文件。
????????當(dāng)我們想要重用復(fù)雜的代碼時(shí),我們使用 Python 包而不是腳本文件和 Jupyter 筆記本。使用腳本文件,代碼可能會(huì)變得混亂且難以維護(hù),而筆記本通常用于探索性工作,但不容易重用。
????????您可以將 Python 包視為一個(gè)獨(dú)立的“項(xiàng)目”。一個(gè)項(xiàng)目可以包含多個(gè)模塊,每個(gè)模塊都包含一組特定的相關(guān)函數(shù)和變量。因此,這使您可以更輕松地將所需“項(xiàng)目”中的工具嵌入到您自己的代碼中。
2.1 從模塊開始
????????模塊是 Python 包的構(gòu)建塊。模塊是包含定義和語句的單個(gè) Python 文件。它們提供了一種將代碼結(jié)構(gòu)化為邏輯單元并在多個(gè)項(xiàng)目中重用代碼的方法。
????????若要在代碼中使用模塊,請(qǐng)使用 import 語句。例如,如果您有一個(gè)名為 mymodule.py
的模塊,則可以通過以下 import 語句在代碼中使用它的函數(shù)和變量:
import mymodule
????????導(dǎo)入模塊后,可以使用點(diǎn) () 表示法訪問其函數(shù)和變量。例如,如果 mymodule.py 文件有一個(gè)名為.
greet
的函數(shù),則可以在代碼中使用它,如下所示:
import mymodule
mymodule.greet("John")
????????讓我們創(chuàng)建自己的示例模塊來說明這個(gè)概念。創(chuàng)建一個(gè)名為examplemodule.py
的文件,并向其中添加以下代碼:
def greet(name):
print("Hello, " + name + "!")
def add(a, b):
return a + b
????????在這里,我們?cè)谖募卸x了兩個(gè)函數(shù)greet
和 add
?,F(xiàn)在可以導(dǎo)入examplemodule.py
這些函數(shù)并在代碼的其他部分中使用。???????
2.2 從模塊到包
????????隨著代碼的增長(zhǎng),在單個(gè)模塊中管理和維護(hù)所有代碼可能會(huì)變得困難。包提供了一種將代碼組織和拆分為多個(gè)模塊的方法,同時(shí)仍保持所有內(nèi)容井井有條且可訪問。
????????要?jiǎng)?chuàng)建包,只需創(chuàng)建一個(gè)目錄并在其中放置一個(gè)或多個(gè)模塊。該目錄應(yīng)包含一個(gè)名為 __init__.py
的特殊文件,該文件告訴 Python 此目錄是一個(gè)包,應(yīng)按包處理。該文件可以留空,也可以包含導(dǎo)入包時(shí)將執(zhí)行的代碼。我們將在下面更詳細(xì)地解釋???????__init__.py
文件。
????????讓我們將上一節(jié)中的示例模塊重構(gòu)為包。創(chuàng)建一個(gè)名為examplepackage
的目錄并將文件???????examplemodule.py
移動(dòng)到其中。然后,創(chuàng)建一個(gè)在examplepackage
目錄中調(diào)用的__init__.py
文件。??????????????
您的文件結(jié)構(gòu)現(xiàn)在應(yīng)如下所示:
examplepackage/
__init__.py
examplemodule.py
????????現(xiàn)在,您可以在代碼中從文件中導(dǎo)入函數(shù),如下所示:examplemodule.py
import examplepackage.examplemodule
examplepackage.examplemodule.greet("John")
examplepackage.examplemodule.add(1, 2)
????????在此示例中,我們已將文件examplemodule.py
重構(gòu)為名為examplepackage
的包。文件examplemodule.py
中的函數(shù)現(xiàn)在可以像以前一樣導(dǎo)入并在代碼中使用,但具有包提供的組織和模塊化的額外好處。??????????????
2.3 什么是__init__.py?
????????__init__.py
是 Python 包中的一個(gè)特殊文件,用作包的入口點(diǎn)。它在導(dǎo)入包時(shí)執(zhí)行,其代碼可用于初始化包或設(shè)置任何必要的組件。該文件是可選的,但通常用于定義包的公共接口,使其他開發(fā)人員更容易理解和使用包。
????????在以前版本的 Python 中,需要__init__.py
將目錄識(shí)別為包。但是,從 Python 3.3 開始,由于引入了 PEP 420,它是可選的,它允許在沒有__init__.py
文件的情況下定義包。
????????下面是如何在包中使用的示例:__init__.py
# examplepackage/__init__.py
from .examplemodule import greet, add
__all__ = [
'greet',
'add',
]
????????在此示例中,該文件從文件__init__.py
導(dǎo)入 greet
和 add
函數(shù),并使它們成為包的公共接口的一部分。__all__
該變量用于定義包的公共接口,并使其他開發(fā)人員更容易理解和使用examplemodule.py
包。?????????????????????
????????通過此設(shè)置,您現(xiàn)在可以從 examplepackage
和 greet、
???????add
函數(shù)導(dǎo)入,如下所示:
import examplepackage
examplepackage.greet("John")
examplepackage.add(1, 2)
三、你如何在 Python 中管理包?
????????開發(fā)人員分發(fā)包的最常見方式是將它們上傳到稱為?Python 包索引 (PyPI)?的公共存儲(chǔ)庫。我們使用一個(gè)名為pip的系統(tǒng),它代表“Pip安裝包”。它是一個(gè)命令行工具,允許用戶從 PyPI 和其他包索引安裝和管理包。
????????如果您使用 ,則已通過 Python 包索引 (PyPI) 下載并安裝了包。pip install
????????像 pip 這樣的包管理系統(tǒng)可以輕松安裝、更新和刪除包,以及管理項(xiàng)目中的依賴項(xiàng)(其他包正常運(yùn)行所需的包)。
四、pip如何工作?
??pip install
是我們用來從名為 PyPI 的庫甚至您自己的計(jì)算機(jī)下載和安裝不同包的命令。當(dāng)您運(yùn)行此命令時(shí),它將檢查該軟件包在 PyPI 上是否可用,如果是,它將下載并將其安裝在您的計(jì)算機(jī)上。此外,它將檢查 - 如果需要,安裝- 包元數(shù)據(jù)中列出的所有依賴項(xiàng)。最后,pip 將跟蹤您安裝的所有軟件包,以幫助您以后升級(jí)或卸載它們。
????????默認(rèn)情況下, pip install
會(huì)安裝最新版本的軟件包,但如果需要,可以選擇使用pip install <PACKAGE>==<VERSION>
pip install numpy==1.23.5
來安裝特定版本,例如,可以使用 。如果你的代碼出現(xiàn)問題并且需要使用特定版本的包,這會(huì)很有幫助。
????????你有沒有注意到,當(dāng)你用來向你的Python代碼添加一個(gè)功能時(shí),你用來安裝它的名稱與你導(dǎo)入它時(shí)使用的名稱不同?發(fā)生這種情況是因?yàn)橛袃煞N類型的名稱:pip install
- 分發(fā)名稱,這是用于安裝 Pack 的名稱
pip install
- 包名稱,這是在代碼中導(dǎo)入包時(shí)使用的名稱。
????????發(fā)行版名稱是唯一的,并且通過 PyPI(從中獲取包的庫)保證與其他包名稱不同。另一方面,包名稱由創(chuàng)建包的人選擇,因此它可能不是唯一的。
????????這就是為什么您可以使用 pip install
安裝名為“dagster-dbt”的包,但使用名稱“dagster_dbt”將其導(dǎo)入代碼中。這也是為什么你可以使用 pip install
來安裝一個(gè)名為“scikit-learn”的包,但使用名稱“sklearn”將其導(dǎo)入到你的代碼中。
五、什么是相對(duì)進(jìn)口與絕對(duì)進(jìn)口?
????????編寫包時(shí),有時(shí)我們可能希望從同一包中的另一個(gè)模塊導(dǎo)入代碼。我們需要在 Python 中導(dǎo)入模塊或包的兩種不同方式之間進(jìn)行選擇,相對(duì)導(dǎo)入或絕對(duì)導(dǎo)入。
????????相對(duì)導(dǎo)入由顯式或隱式導(dǎo)入組成,但您實(shí)際上只需要了解顯式相對(duì)導(dǎo)入,因?yàn)?Python 3 不支持隱式相對(duì)導(dǎo)入。
????????相對(duì)導(dǎo)入使用前導(dǎo)點(diǎn)。單個(gè)前導(dǎo)點(diǎn)表示相對(duì)導(dǎo)入,從當(dāng)前包開始。兩個(gè)或多個(gè)前導(dǎo)點(diǎn)表示對(duì)當(dāng)前包的父級(jí)的相對(duì)導(dǎo)入,第一個(gè)點(diǎn)之后每個(gè)點(diǎn)一個(gè)級(jí)別。例如,給定以下包布局:
package/
__init__.py
subpackage1/
__init__.py
moduleX.py
moduleY.py
subpackage2/
__init__.py
moduleZ.py
moduleA.py
????????對(duì)應(yīng)的相對(duì)導(dǎo)入是指:在 subpackage1/moduleX.py 或 subpackage1/__init__.py 中,以下是有效的相對(duì)導(dǎo)入:
from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
????????相對(duì)導(dǎo)入允許您導(dǎo)入相對(duì)于當(dāng)前模塊的模塊。它們使用關(guān)鍵字“from”,后跟當(dāng)前包的名稱以及要導(dǎo)入的模塊或包的名稱。例如,如果有一個(gè)以兩個(gè)模塊命名的包,并且 可以使用相對(duì)導(dǎo)入將代碼從 py
module1.py
導(dǎo)入module2.py
,如下所示:
# examplepackage/module2.py
from .module1 import greeting
def greet(name):
print(greeting + " " + name)
????????在這里,from .module1 import greeting
相對(duì)導(dǎo)入用于將???????greeting
變量從???????module1.py
文件導(dǎo)入到???????module2.py
文件中。???????.
module1
前面指示導(dǎo)入應(yīng)相對(duì)于當(dāng)前模塊。
????????絕對(duì)導(dǎo)入允許您使用模塊的全名導(dǎo)入模塊,而不管它們相對(duì)于當(dāng)前模塊的位置如何。它們使用要導(dǎo)入的模塊或包的完整路徑。例如,您可以使用絕對(duì)導(dǎo)入將greeting
變量從module1.py
文件轉(zhuǎn)移到module2.py
文件中,如下所示:
# examplepackage/module2.py
from examplepackage.module1 import greeting
def greet(name):
print(greeting + " " + name)
????????在這里,from examplepackage.module1 import greeting
絕對(duì)導(dǎo)入用于將greeting
變量從module1.py
文件導(dǎo)入到module2.py
文件中。模塊的全名 examplepackage.module1
用于指定模塊的位置。?????????????????????文章來源:http://www.zghlxwxcb.cn/news/detail-700489.html
????????在 Python 3 中,相對(duì)導(dǎo)入必須是顯式的,絕對(duì)導(dǎo)入是默認(rèn)行為。文章來源地址http://www.zghlxwxcb.cn/news/detail-700489.html
到了這里,關(guān)于【Python 程序設(shè)計(jì)】包和數(shù)據(jù)人員入門【01/8】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!