1 回答

TA貢獻1770條經驗 獲得超3個贊
如果您想對用戶隱藏實施細節,可以采用兩種方法。第一個使用約定來表示什么是公共 API 的一部分,什么不是公共 API 的一部分,另一個是 hack。
在 python 庫中聲明 API 的約定是將所有應公開的類/函數/名稱添加到最頂層的__all__
-list__init__.py
中。它并沒有做那么多有用的事情,現在它的主要目的是象征性的“請使用這個而不是別的”。你的可能看起來有點像這樣:
urdu/urdu/__init__.py
from?urdu.stemmer?import?Foo,?Bar,?Baz __all__?=?[Foo,?Bar,?Baz]
為了強調這一點,你也可以在他們的名字之前用stemmerUtil.py
?下劃線給出所有的定義,例如def privateFunc(): ...
變成def _privateFunc(): ...
但是您也可以通過將代碼作為資源而不是包中的模塊并動態加載它來對解釋器隱藏代碼。這是一個 hack,可能是個壞主意,但在技術上是可行的。
首先,你重命名stemmerUtil.py
為 just?stemmerUtil
- 現在它不再是一個 python 模塊,不能用import
關鍵字導入。接下來,更新這一行stemmer.py
import?stemmerUtil
和
import importlib.util
import importlib.resources??
# in python3.7 and lower, this is importlib_resources and needs to be installed first
stemmer_util_spec = importlib.util.spec_from_loader("stemmerUtil", loader=None)
stemmerUtil = importlib.util.module_from_spec(stemmer_util_spec)
with importlib.resources.path("urdu", "stemmerUtil") as stemmer_util_path:
? ? with open(stemmer_util_path) as stemmer_util_file:
? ? ? ? stemmer_util_code = stemmer_util_file.read()
exec(stemmer_util_code, stemmerUtil.__dict__)
運行此代碼后,您可以stemmerUtil像導入它一樣使用該模塊,但安裝您的包的任何人都看不到它 - 除非他們也運行此確切代碼。
但正如我所說,如果您只是想與您的用戶交流您的包的哪一部分是公共 API,那么第一種解決方案更為可取。
添加回答
舉報