使用子模块时,模块可以与包本身同名吗?
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
做)
目前,我有一个包名(假设是 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
做)