python - 重命名 python 子包,将旧名称标记为已弃用

标签 python python-3.x python-3.6 python-3.5

我有一个 python 包,它具有以下目录结构

package/
├── __init__.py
└── subpackage_A/
    ├── __init__.py
    ├── moduleA.py
    └── moduleB.py

现在我想将 subpackage_A 的名称更改为 subpackage_B,同时保持旧名称可用,否则很多脚本会中断。所以这应该是可能的:

from package.subpackage_B import moduleA
from package.subpackage_B.moduleB import ClassB

# This should, if possible, display a deprecation warning
from package.subpackage_A import moduleA

我试图简单地将新包导入名为 subpackage_A 的模块中,但这不起作用:

# File: package/subpackage_A.py
# This does not work:
from package.subpackage_B import *  # Import everything from the new module

# This is also not working:
sys.modules[__name__] = __import__('package.subpackage_A')

如果脚本尝试从旧位置导入 moduleA,第一个版本会导致 ModuleNotFoundError:

from package.subpackage_A import moduleA
Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'package.subpackage_A.moduleA'

如何在不破坏向后兼容性的情况下重命名模块?该解决方案应适用于 python 3.5 及更高版本。

最佳答案

如果您使用的是 Python 3.7+,您可以使用 PEP562 中定义的模块级 __getattr__ .

您将您的 subpackageA 重命名为 subpackageB,然后在您的 package/__init__.py 中有类似以下内容

from . import subpackageB
from warnings import warn

def __getattr__(name):
    if name == 'subpackageA':
        warn('subpackageA has been renamed to subpackageB')
        return subpackageB
    raise AttributeError('No module named ' + name)

然后在使用你的包时

>>> from package import subpackageB
>>> from package import subpackageA
/path/to/package/__init__.py:5: UserWarning: subpackageA has been renamed subpackageB
  warn('subB has been renamed subA')
>>> subpackageA == subpackageB
true
>>>

关于python - 重命名 python 子包,将旧名称标记为已弃用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57093638/

相关文章:

python - 是否可以从列表理解中调用函数,而无需调用函数的开销?

tensorflow - 属性错误 : module 'tensorflow' has no attribute 'Session'

python - 使用boto在带有LSI的dynamoDB中创建表

python - 在 feedparser 中使用 ETag

python - Counter() 减去

python 3.4 tkinter frame 不填充垂直方向

python - Soundcloud API 未通过 Python 返回播放列表中的所有轨道

python - TraitsUI 中的 Mayavi 颜色条创建空白窗口

python - 加入正则表达式搜索的输出

pandas - 需要向 pd.df 添加一列,其中包含函数中的值