GitHub上的Python文件结构
我最近在看一些开源的Python项目,发现里面有很多我不太熟悉的文件和结构。
首先,很多项目都有一个叫做 setup.py
的文件,这个文件通常只包含一个函数:
setup(blah, blah, blah)
其次,很多项目里还有一个叫 __init__.py
的文件,里面几乎没有什么内容。
第三,有些 .py
文件里会有类似这样的语句:
if __name__ == "__main__"
最后,我想知道在git仓库中,分割Python文件有没有什么“最佳实践”。在Java中,文件的划分比较自然,因为有类的结构。而在Python中,很多脚本根本没有类,有时候程序会有面向对象的特性,但按类来划分文件并不太合理。是不是只要“让代码更易读”就行,还是说这方面有一些指导原则呢?
3 个回答
setup.py
是 Python 中一个叫做 distutils 的工具的一部分。你如果想要分享一个模块,而不仅仅是一个简单的脚本,就需要这个文件(即使是简单脚本,拥有这个文件也是个好主意,这样将来可以方便地扩展成模块)。
__init__.py
是 Python 中 导入模块 的一部分:
命名为 init.py 的文件用于标记磁盘上的目录为 Python 包目录。如果你有这些文件:
mydir/spam/init.py、mydir/spam/module.py,并且 mydir 在你的路径中,你可以这样导入 module.py 中的代码:
import spam.module 或者
from spam import module 如果你删除了 init.py 文件,Python 就不会再在那个目录中查找子模块了,所以尝试导入模块会失败。
if __name__ == "__main__"
是一种方式,用来指示如果这个文件被直接运行而不是被导入时,哪些代码会被执行。
关于如何布局你的代码,distfiles
的文档中有一个 很好的指南。
setup.py
是 Python 模块分发的一部分,它使用了一个叫做 分发工具。这个文件可以让你很方便地安装 Python 模块,特别是当你想把你的项目作为一个完整的 Python 模块来分享时,它就特别有用了。
__init__.py
是 Python 的 包系统的一部分。通常情况下,一个空文件就足够让 Python 识别它所在的目录是一个包了,但你也可以在里面定义一些其他的内容。
最后,__name__ == '__main__'
这个检查是为了确保当前的脚本是直接运行的(比如从命令行运行),而不是被其他脚本导入。在执行 Python 脚本时,只有一个模块的 __name__
属性会等于 __main__
。你可以查看 我在这里的回答,或者更一般的关于这个主题的 问题。