python模块层次结构命名约定

时间:2013-03-06 02:17:56

标签: python module python-module

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

/__init__.py
/mymodule.py
/mymodule/
/mymodule/__init__.py
/mymodule/submodule.py

然后使用以下模块:

import mymodule
import mymodule.submodule

但似乎文件“ mymodule.py ”与“ mymodule ”目录冲突。

这里的正确命名约定是什么?

2 个答案:

答案 0 :(得分:13)

如果您想创建一个包,您必须了解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搜索路径中。

答案 1 :(得分:6)

您正在处理package。你应该拥有的包结构是:

/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文件中

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

from .submodule_impl import CustomClass

然后您就可以直接从CustomClass导入submodule(即from mymodule.submodule import CustomClass