使用点分子语法在子包中对模块进行包内引用

时间:2016-04-19 14:12:33

标签: python module package

我有以下包结构:

.
└── 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.pypackage/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))。

我的问题是:

  1. 有没有办法使用单个导入而不是上面的两个?
  2. 为什么(通常)import package后跟from package import modulemodule添加到package? Python实际上在这做什么?

1 个答案:

答案 0 :(得分:0)

1

在sub_package_2的文件__init__.py中编写

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 的包some_module的模块sub_package_2的引用。它类似于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