這是一個專案的原始結構:
project/
mypackage
__init__.py
moduleA.py
我想移動moduleA.py到一個子包:
project/
mypackage
__init__.py
subpackage
__init__.py
moduleA.py
我需要保持向后兼容性,以便使用的舊代碼import mypackage.moduleA仍然有效。
我嘗試將其添加到project/mypackage/__init__.py:
from subpackage import moduleA
這讓我可以import mypackage.moduleA。但不幸的是,它moduleA一匯入就強制mypackage匯入,這不是我想要的(我正在制作moduleA一個可選包,因此不能保證依賴關系)。
我仍然可以在運行mypackage.moduleA時使用延遲模塊加載來啟用匯入嗎?import mypackage用戶應顯式匯入mypackage.moduleA以觸發匯入。
uj5u.com熱心網友回復:
您可以使用模塊級 getattr掛鉤在首次使用時延遲加載“moduleA”。
# in mypackage/__init__.py
some_other_name = 123
def __getattr__(name):
global moduleA
if name == "moduleA":
from mypackage.subpackage import moduleA
return moduleA
raise AttributeError(name)
需要 Python-3.7 。請注意,getattr 僅針對在命名空間中未找到的名稱呼叫,因此from mypackage import some_other_name不會呼叫鉤子,也不會觸發子包的早期匯入。
這將起作用:
from mypackage import moduleA
這也將起作用:
import mypackage
mypackage.moduleA
盡管要注意保持向后兼容性的一個重要警告。直接子模塊匯入將不起作用,因為子模塊實際上并沒有被匯入系統直接找到:
import mypackage.moduleA
為避免破壞這種形式的 import 陳述句,您仍可以包含一個mypackage/moduleA.py檔案(可以是棄用 shim)
# in mypackage/moduleA.py
import warnings
warnings.warn(
message="mypackage.moduleA has moved to mypackage.subpackage.moduleA",
category=DeprecationWarning,
stacklevel=2,
)
from mypackage.subpackage.moduleA import *
棄用通知應該在幾個版本中保留,然后您可以mypackage/moduleA.py在下一個中斷版本中完全洗掉,請務必在發布說明中提及更改。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/466429.html
標籤:Python python-3.x 蟒蛇导入 蟒蛇包装
上一篇:Python找不到指定的檔案
下一篇:如何按特定組的行數過濾資料集?
