我有一个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')
如果脚本试图从旧位置导入ModuleNotFoundError
,则第一个版本会导致ModuleNotFoundError
:
from package.subpackage_A import moduleA
Traceback (most recent call last):
...
ModuleNotFoundError: No module named 'package.subpackage_A.moduleA'
如何在不破坏向后兼容性的情况下重命名模块?该解决方案应适用于Python3.5及更高版本。你知道吗
如果您使用的是python3.7+,那么可以使用在PEP562中定义的模块级
__getattr__
。你知道吗您可以将subpackageA重命名为subpackageB,然后在
package/__init__.py
中有如下内容那么在使用你的软件包时
问题是
subpackage_B/__init__.py
不导入moduleA
,moduleB
,所以import *
什么也不导入。你知道吗使用显式导入:
或者修改
subpackage_B/__init__.py
以显式执行导入:关于在使用子包时发出警告:您可以简单地触发它。内部
subpackage_A
:相关问题 更多 >
编程相关推荐