我想要有如下的模块/包结构:
/__init__.py
/mymodule.py
/mymodule/
/mymodule/__init__.py
/mymodule/submodule.py
然后使用如下模块:
import mymodule
import mymodule.submodule
但似乎文件“ mymodule.py ”与“ mymodule ”目录冲突。
这里正确的命名约定是什么?
我想要有如下的模块/包结构:
/__init__.py
/mymodule.py
/mymodule/
/mymodule/__init__.py
/mymodule/submodule.py
然后使用如下模块:
import mymodule
import mymodule.submodule
但似乎文件“ mymodule.py ”与“ mymodule ”目录冲突。
这里正确的命名约定是什么?
如果你想制作一个包,你必须了解 Python 如何将文件名转换为模块名。
该文件mymodule.py
将以 . 的形式提供mymodule
,假设解释器在 Python 搜索路径的目录中找到它。如果您使用的是不区分大小写的文件系统,它也可能可以使用不同的大小写导入(但您应该避免使用这种依赖于系统的行为)。
包是一个包含__init__.py
文件的目录。最近有一些动作允许没有这些文件的包,但我将忽略这个答案的不太常见的情况。一个包成为 Python 中的一个模块,其代码来自__init__.py
文件。所以文件mypackage/__init__.py
可以导入为mypackage
.
直接在 Python 搜索路径中的文件没有任何意义__init__.py
(好吧,我想你可以将它导入一个__init__
模块,但这可能是个坏主意)。
因此,对于您的情况,这是适当的文件系统布局:
toplevel/
mymodule/
__init__.py # put code here for mymodule
submodule.py # put code here for mymodule.submodule
只有toplevel
文件夹应该在 Python 搜索路径中。
您正在处理一个包裹。你应该有的包结构是:
/some-parent-directory # This needs to be on sys.path
/mymodule # This is not really a module - it's a package
__init__.py # import mymodule
# init is loaded when you `import mymodule` or anything below it
some.py # import mymodule.some
implementation.py # import mymodule.implementation
files.py # import mymodule.files
/submodule
__init__.py # import mymodule.submodule
# init is loaded when you `import mymodule.submodule` or anything below it
submodule_impl.py # import mymodule.submodule.submodule_impl
goes.py # import mymodule.submodule.goes
here.py # import mymodule.submodule.here
只要父目录打开,sys.path
您就可以调用import mymodule
或from mymodule.submodule import something
没有问题。
如果您想从包的根级别(即from mymodule import SomeItem
或从子包from mymodule.submodule import AnotherItem
)中获得某些东西,那么您可以将其导入到适当的__init__.py
文件中。
因此,例如,假设您希望模块中CustomClass
定义的类submodule_impl.py
可以直接从submodule
. 您submodule/__init__.py
必须包含以下内容:
from .submodule_impl import CustomClass
然后你就可以CustomClass
直接从submodule
(即from mymodule.submodule import CustomClass
)导入