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 线程内存布局(结合 boost::python)