[英]Python how to alias module name (rename with preserving backward compatibility)
我有一個名為foo
的python包,我在導入中使用它:
import foo.conf
from foo.core import Something
現在我需要將foo
模塊重命名為其他東西,讓我們說bar
,所以我想這樣做:
import bar.conf
from bar.core import Something
但我想保持與現有代碼的向后兼容性,因此舊的( foo.
)導入應該也可以和bar.
進口。
如何在python 2.7中實現?
這會強制你保留一個foo
目錄,但我認為這是讓它工作的最好方法。
目錄設置:
bar
├── __init__.py
└── baz.py
foo
└── __init__.py
foo_bar.py
bar/__init__.py
為空。
bar/baz.py
worked = True
foo/__init__.py
:
import sys
# make sure bar is in sys.modules
import bar
# link this module to bar
sys.modules[__name__] = sys.modules['bar']
# Or simply
sys.modules[__name__] = __import__('bar')
foo_bar.py
:
import foo.baz
assert(hasattr(foo, 'baz') and hasattr(foo.baz, 'worked'))
assert(foo.baz.worked)
import bar
assert(foo is bar)
你的意思是這樣的嗎?
import foo as bar
您可以使用快捷方式進行模塊導入,例如:
from numpy import array as arr
in: arr([1,2,3])
out: array([1, 2, 3])
並且您也可以一次使用多個別名
from numpy import array as foo
in: foo([1,2,3])
out: array([1, 2, 3])
如果你的foo
是一個類,你可以做:
bar=foo()
並通過以下方式調用它的子功能:
bar.conf()
這對你有幫助嗎?
這個答案適用於子模塊:
import sys
import os
from importlib.abc import MetaPathFinder, Loader
import importlib
from MainModule.SubModule import *
class MyLoader(Loader):
def module_repr(self, module):
return repr(module)
def load_module(self, fullname):
old_name = fullname
names = fullname.split(".")
names[1] = "SubModule"
fullname = ".".join(names)
module = importlib.import_module(fullname)
sys.modules[old_name] = module
return module
class MyImport(MetaPathFinder):
def find_module(self, fullname, path=None):
names = fullname.split(".")
if len(names) >= 2 and names[0] == "Module" and names[1] == "LegacySubModule":
return MyLoader()
sys.meta_path.append(MyImport())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.