【问题标题】:Intra-package reference of modules in sub-packages using dotted syntax使用点分语法的子包中模块的包内引用
【发布时间】:2016-08-11 18:46:37
【问题描述】:

我的包结构如下:

.
└── 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 究竟在这里做什么?

【问题讨论】:

    标签: python module package


    【解决方案1】:

    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 的包 sub_package_2 的模块 some_module 的引用。类似于some_module = sub_package_2.some_module。你看:sub_package_2 中也有对some_module 的引用。现在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
    

    【讨论】:

    • 谢谢!在__init__.py 中写import some_module 而不是from . import some_module 有任何(技术)差异吗? Python 无论如何都会首先尝试从当前包中导入,不是吗?
    • 在您的情况下它们是相同的,但在技术上并不相同。 from . import xxx 只能在你的包中导入模块/包。如果您的包中不存在模块xxx -> 总是错误。 import xxx 可以从 python 库中导入模块 xxx,如果你的包中不存在模块 xxx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 2023-01-09
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多