使用子模块时,模块是否与包本身具有相同的名称?

时间:2016-03-02 15:10:08

标签: python-2.7 packages python-module package-structuring

对不起,如果标题令人困惑,我会尝试通过更详细的说明来解释这个问题。

目前,我有一个包名,让我们说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 / dir和DummyPackage / dir,但都不起作用。

是因为姓名冲突吗?是否可以拥有这样的代码?

import DummyPackage
from DummyPackage.Module1.module_x import method_x

DummyPackage.new_method
method_x

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:0)

将我的三条评论写在答案中:

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

module_y.py

from .module_x import method_x

或类似于module_z.py

from ..Module1.module_x import method_x

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

至于第二部分是的,可以使用(runnable)代码:

import DummyPackage
from DummyPackage.Module1.module_x import method_x

DummyPackage.new_method
method_x

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

  

除了将目录标记为Python包并定义__all__之外, __init__.py还允许您在包级别定义任何变量。

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

或者作为一个示例,您的设置可以直接从包中导入method_x,您只需将其添加到顶级__init__.py

from .Module1.module_x import method_x

然后从导入包的任何文件中执行此操作:

import DummyPackage

DummyPackage.method_x

(虽然很明显你会根据new_method的位置DummyProject来做{/ 1>}