Python如何别名模块名称(重命名保留向后兼容性)

时间:2014-06-20 08:21:36

标签: python python-2.7 import python-importlib

我有一个名为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中实现?

3 个答案:

答案 0 :(得分:10)

这会强制您保留foo目录,但我认为这是让它运行的最佳方式。

目录设置:

bar
├── __init__.py
└── baz.py
foo
└── __init__.py

foo_bar.py

bar/__init__.py为空 bar/baz.pyworked = 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)

答案 1 :(得分:6)

你的意思是这样吗?

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()

这对你有帮助吗?

答案 2 :(得分:1)

此答案适用于子模块:

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())