Python模块层次结构命名约定



我想有模块/包结构如下:

/__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 mymodulefrom mymodule.submodule import something

如果你想从包的根级(即from mymodule import SomeItem或从子包from mymodule.submodule import AnotherItem)中获得一些东西,那么你可以将它导入到适当的__init__.py文件中。

因此,例如,假设您希望在submodule_impl.py模块中定义的类CustomClass可以直接从submodule导入。您的submodule/__init__.py必须包含以下内容:

from .submodule_impl import CustomClass

那么您将能够直接从submodule(即from mymodule.submodule import CustomClass)导入CustomClass

最新更新