我有以下包结构:
.
└── package
├── __init__.py
├── sub_package_1
│ ├── __init__.py
│ └── main_module.py
├── sub_package_2
│ ├── __init__.py
│ └── some_module.py
└── sub_package_3
├── __init__.py
└── some_module.py
在 package/sub_package_1/main_module.py
我想同时使用 package/sub_package_2/some_module.py
和 package/sub_package_3/some_module.py
。为此,我想使用 intra-package reference .我知道我可以使用 from ..sub_package_1 import some-module
但由于名称相似,我想使用点分语法,例如 sub_package_1.some_module
。
使用 from .. import sub_package_2
我显然无法访问 sub_package_2.some_module
因为 sub_package_2
是一个包。但是我发现使用
from .. import sub_package_2
from ..sub_package_2 import some_module
我可以访问 sub_package_2.some_module
。显然,第二次导入将 some_module
添加到 sub_package_2
(检查 dir(sub_package_2)
)。
我的问题是:
- 有没有一种方法可以使用单个导入而不是上面的两个?
- 为什么(通常)
import package
后跟from package import module
添加module
到package
? Python 实际上在这里做什么?
最佳答案
1.
在文件中__init__.py
你写的 sub_package_2
from . import some_module
并且在 main_module.py
你可以必须写
from .. import sub_package_2
代码sub_package_2.some_module
现在应该可以工作了
2.
“如何在 Python 中导入”您可以在此处阅读更多信息 Importing Python Modules
from .. import sub_package_2
创建对 sub_package_2
的引用在当前命名空间中。包裹sub_package_2
现在就像一个模块,在文件 __init__.py
中定义.如果你在 __init__.py
中什么也没写, sub_package_2 不会知道 some_modue
from ..sub_package_2 import some_module
创建对模块的引用 some_module
包裹sub_package_2
名称为 some_module。有点像 some_module = sub_package_2.some_module
.你看:有对 some_module
的引用在sub_package_2
也。现在sub_package_2
知道模块some_module
重要提示:您可以使用 sub_package_2.some_module
但只有some_module
也会工作。在您的 2 次导入后它们是相同的。
如果你写在 __init__.py
:
from . import some_module
some_module
属于sub_package_2
自动
对于类似的模块名称,您可以使用 as
from ..sub_package_1 import some_module as some_module_1
from ..sub_package_2 import some_module as some_module_2
from ..sub_package_3 import some_module as some_module_3
关于python - 使用点分语法的子包中模块的包内引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36720939/