使用子模块时,模块可以与包本身同名吗?

Can a module have the same name as the package itself when submodules are used?

目前,我有一个包名(假设是 DummyPackage)。 DummyPackage包含三个模块,功能类等。所以目录结构是这样的:

project_dir/
    __init__.py
    DummyPackage/
        __init__.py
        Module1/
            __init__.py
            module_x.py
            module_y.py
        Module2/
            __init__.py
            module_z.py

所以从模块导入方法看起来像这样

from DummyPackage.Module1.module_x import method_x

我们正在向项目中添加新内容,我想创建一个名为 DummyProject 的模块,它应该可以像这样导入

from DummyProject import new_method

我假设,只添加文件 DummyPackage.py 就足够了,但显然,事实并非如此。我试图将它添加到 project_dir/ 目录和 DummyPackage/ 目录,但都不起作用。

是名字冲突吗?是否可以有这样的代码?

import DummyPackage
from DummyPackage.Module1.module_x import method_x

DummyPackage.new_method
method_x

将我的三个评论放在一个答案中:

首先让我解释一下 relative imports 使用您已有的模块,如果您想从 module_y 导入 module_x 您可以这样做:

module_y.py

from .module_x import method_x

或类似 module_z.py

from ..Module1.module_x import method_x

因此,根据您的 DummyProject 在包裹中的位置,Intra-package References 可能就是您所需要的。

至于第二部分,是的,可以有这样的(可运行的)代码:

import DummyPackage
from DummyPackage.Module1.module_x import method_x

DummyPackage.new_method
method_x

在这种情况下,您似乎希望 new_method 成为包级变量。引用 this great answer:

In addition to labeling a directory as a Python package and defining __all__, __init__.py allows you to define any variable at the package level.

如果您想要真实世界的示例,我强烈建议您查看标准库中 json/__init__.py 的源代码。

或者以您的设置为例,为了能够直接从包中导入 method_x,您只需将其添加到顶层 __init__.py:

from .Module1.module_x import method_x

然后从任何导入包的文件你可以这样做:

import DummyPackage

DummyPackage.method_x

(虽然显然你会根据你放置 DummyProject 的位置为 new_method 做)