輕松導(dǎo)入和執(zhí)行Python模塊的3種技巧
引言
作為一名程序員,你肯定希望與團(tuán)隊(duì)其他用戶共享你所創(chuàng)建的有用模塊。盡管你的模塊可能有用,但是如果其他人需要花費(fèi)大量精力來訪問模塊中的有用功能,則其他人將不會(huì)使用它。
因此,如果想使用戶易于使用你的模塊,導(dǎo)入和運(yùn)行模塊的代碼應(yīng)該簡(jiǎn)短。本文將向你展示3種簡(jiǎn)化導(dǎo)入和執(zhí)行Python模塊的方法。
導(dǎo)入
場(chǎng)景
假設(shè)我們有一個(gè)名為 utils.py 的文件,其中包含所有重要的函數(shù)和類
def add_two(num: int):return num + 2def multiply_by_two(num: int):return num * 2a = 5
在另一個(gè)腳本中,我們使用 from utils import * 從 utils.py 中導(dǎo)入所有內(nèi)容,除了變量 a 。那我們?cè)撛趺醋瞿兀?/span>
解決方案
要做到這點(diǎn)很容易,只要加入__all__ = [“add_two”, “multiply_by_two”]即可。使用 import * 時(shí),__all__ 中指定的函數(shù)、類和包將被導(dǎo)入。
__all__ = ["add_two", "multiply_by_two"]def add_two(num: int):return num + 2def multiply_by_two(num: int):return num * 2a = 5
現(xiàn)在嘗試在另一個(gè)腳本中使用 import *
from utils import *num = 3print(add_two(num))print(multiply_by_two(num))print(a)
56Traceback (most recent call last):File "main.py", line 6, in <module>print(a)NameError: name 'a' is not defined
Cool!這個(gè)錯(cuò)誤告訴我們,只從 utils.py 中導(dǎo)入了 add_two 和 multiply_by_two ,而并未導(dǎo)入變量 a 。
合并多個(gè)文件
場(chǎng)景
想象一下我們目錄中文件的結(jié)構(gòu)如下:
.├── data_modules│ ├── load_data.py│ └── process_data.py└── main.py
load_data.py 如下所示:
class DataLoader:def __init__(self, data_dir: str):self.data_dir = data_dirdef load_data(self):print(f"Loading data from {self.data_dir}")
process _ data.py 如下所示:
class DataProcessor:def __init__(self, data_name: str):self.data_name = data_namedef process_data(self):print(f"Processing {self.data_name}")
要使用來自兩個(gè)不同文件的類,我們需要從每個(gè)文件導(dǎo)入每個(gè)類。
from data_modules.load_data import DataLoaderfrom data_modules.process_data import DataProcessordata_loader = DataLoader('data/')data_loader.load_data()data_processor = DataProcessor('data1')data_processor.process_data()
這個(gè)方法很好,但是使用2個(gè)導(dǎo)入語句是很繁瑣的。有沒有一種方法,我們可以把兩個(gè)導(dǎo)入語句變成一個(gè)導(dǎo)入語句,就像下面這樣。
from data_modules import DataLoader, DataProcessor解決方案
在 data _ modules 目錄下插入 _ init _. py 文件可以很容易地解決這個(gè)問題:
touch data_modules/__init__.py然后將前面提到的 import 語句插入到 _ init _. py 文件中:
from .load_data import DataLoaderfrom .process_data import DataProcessor
我們?cè)谶@里使用一個(gè) "." ,因?yàn)?load_data.py 和 _init _. py 在同一個(gè)目錄中。
現(xiàn)在,讓我們嘗試從 data_modules 導(dǎo)入 DataLoader 和 DataProcessor 。
from data_modules import DataLoader, DataProcessordata_loader = DataLoader('data/')data_loader.load_data()data_processor = DataProcessor('data1')data_processor.process_data()
Loading data from data/Processing data1
太棒了! 成功了!
像腳本一樣運(yùn)行目錄
場(chǎng)景
我們的目錄是這樣的:
.└── data_modules├── __init__.py├── load_data.py├── main.py└── process_data.py
當(dāng)我們運(yùn)行 main.py 的時(shí)候是這樣的:
python data_modules/main.py我們可能希望簡(jiǎn)化用戶或隊(duì)友運(yùn)行 main.py 代碼的步驟,只需運(yùn)行父目錄:
python data_modules這比運(yùn)行 data_modules/main.py 更好,因?yàn)樗蹋脩舨恍枰?data_modules 中有哪些文件。
我們?cè)趺床拍茏龅侥兀?/span>
解決方案
這時(shí),__main__.py 就派上用場(chǎng)了。只需將運(yùn)行頂級(jí)目錄時(shí)要運(yùn)行的腳本更改為__main__.py 即可。在我們的例子中,我們需要將 main.py 變?yōu)?span style="color: rgb(41, 41, 41);background-color: rgb(242, 242, 242);">__main__.py。
Rename main.py to __main__.pymv data_modules/main.py data_modules/__main__.py
我們的新目錄將如下所示
.└── data_modules├── __init__.py├── load_data.py├── __main__.py└── process_data.py
現(xiàn)在讓我們測(cè)試下
$ python data_modulesLoading data from data/Processing data1
效果非常好!
總結(jié)
在本文中,我們了解了如何讓你和那些使用你的軟件包的人更容易使用它。希望可以幫到你~
