python模块布局

Posted

技术标签:

【中文标题】python模块布局【英文标题】:python module layout 【发布时间】:2011-05-06 11:11:19 【问题描述】:

我刚刚开始在我的 python 项目中指出我需要开始使用多个包,但我对所有东西应该如何协同工作有点困惑。包的__init__.py 究竟应该包含什么?我看到的一些项目只有空白的初始化,它们的所有代码都在该包的模块中。其他项目似乎在 init 中实现了包的大部分类和函数。

是否有文档或样式指南或其他内容描述了 Python 作者对使用包和 __init__ 文件等的想法?

编辑: 我知道拥有__init__.py 文件最简单的意义在于它使文件夹成为一个包。但是为什么我要在同一个文件夹(包)中放一个函数而不是一个模块呢?

【问题讨论】:

【参考方案1】:

__init__.py 可以为空,但它真正的作用是确保 Python 正确处理您的目录,提供导入包时可能需要的任何初始化(配置环境或类似的东西),或定义 @ 987654324@ 以便 Python 在有人使用 from package import * 时知道该怎么做。

docs on Packages 中描述了您需要了解的大部分内容。 Dive Into Python also has a piece on packaging.

【讨论】:

【参考方案2】:

你已经知道了,我猜需要 __init__.py 文件才能让 Python 将目录视为包含包。

    在上述模型中,__init__.py 可以保持为空。

    也可以执行包的初始化代码。

    您还可以设置 __all__ 变量。

[编辑:学习] 当你执行“from package import item”或“from package import *”时,可以使用变量__all__来导入选定的包。

见:http://docs.python.org/tutorial/modules.html

【讨论】:

__init__.py, __all__。双下划线 @Rafe Kettler:谢谢。是的,编辑问题。我的答案和你的一样,在发布之前我没有看到。 对于from package import item,变量__all__ 不控制暴露的内容。如果item 是模块或子包,并且您在Windows 上,__all__ 可能控制item 的大小写,但它不控制您可以访问的内容。 @SvenMarnach:all 主要用于通配符导入。它不尝试提供任何形式的访问控制。详情请见docs.python.org/tutorial/modules.html#importing-from-a-package。

以上是关于python模块布局的主要内容,如果未能解决你的问题,请参考以下文章

更改模块目录后的 Python 酸洗

python-25 logging日志模块之二

在一个多模块的python项目中,如何在子模块中引用项目的根目录?

Python 线程内存布局(结合 boost::python)

Python基础(11)_python模块之time模块rando模块hashlibos模块

python模块自学