python项目的代码结构包括,单个python文件的结构和整个项目的目录结构。
一、文件结构
打开一个标准的python文件,我们发现有如下的片段,对每一个片段存在的意义进行分析,就可以总结出python文件的一般结构。参考如下:
# /usr/bin/env/ python # (1) 起始行
# -*- coding: utf-8 -*- # (2) 声明文件中的编码格式,在使用中文过程中,最好使用utf-8
"this is a test module" # (3) 模块文档(文档字符串)
import sys
import os # (4) 模块导入
debug = True # (5) (全局)变量定义
class FooClass(object):
'foo class'
pass # (6) 类定义(若有)
def test():
'test function'
foo = FooClass()
if debug:
print('ran test()') # (7) 函数定义(若有)
if __name__ == '__main__': # (8) 主程序
test()
1、文件头注释:一般包括起始行,编码格式,模块文档说明
2、import:引入第三方的包或者模块名,调用其变量,函数和类。
import跟C/C++中的#include作用有点类似,都是为了调用定义在其他文件中的变量、函数或者类。python中如果a.py import了b.py那么不是把b.py的原代码加到a.py中,而是把b.py编译为一个module类型的对象,保存到b.pyc文件中,然后读取到内存中。在a.py中可以调用module对象中的变量、函数、类。其中b.py中的普通语句会在编译的时候被直接执行。
还可以在后缀添加as ...取别名简化引用,如:import pandas as pd。
关于Python包和模块的10个知识清单,常见导入语法:
import # 导入一个包
import # 导入一个模块
from import # 从一个包中导入模块/子包/对象
from import
可以被import语句导入的对象是以下类型:
•模块文件(.py文件)
•C或C++扩展(已编译为共享库或DLL文件)
•包(包含多个模块)
•内建模块(使用C编写并已链接到Python解释器中)
导入模块时:模块通常为单独的.py文件,可以用import直接引用,可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dll。
导入包:多个相关联的模块组成一个包,以便于维护和使用,同时能有限的避免命名空间的冲突。例如包结构如下:
package
|- subpackage1
|- __init__.py
|- a.py
|- subpackage2
|- __init__.py
|- b.py
针对以上结构的包的import方法如下:
import subpackage1.a # 将模块subpackage.a导入全局命名空间,例如访问a中属性时用subpackage1.a.attr
from subpackage1 import a # 将模块a导入全局命名空间,例如访问a中属性时用a.attr_a
from subpackage.a import attr_a # 将模块a的属性直接导入到命名空间中,例如访问a中属性时直接用attr_a
使用from语句可以把模块直接导入当前命名空间,from语句并不引用导入对象的命名空间,而是将被导入对象直接引入当前命名空间。
3、变量定义:定义自己使用的全局变量和内部使用的变量。
4、函数定义:定义自己使用的函数和对外提供的函数。
5、类定义及类函数实现:定义自己使用的类和对外提供的类功能
6、__name__和__main__
(1) __name__ 是python的内置属性,是系统全局变量!每一个py文件都有一个属于自己的__name__:
如果py文件作为模块被导入(import),那么__name__就是该py文件的文件名(也称 模块名);
如果py文件直接运行时(Ctrl+Shift+F10),那么__name__默认等于字符串”__main__”;
(2)__main__ 实际上就是一个字符串,用来鉴别程序入口,没有太多花里胡哨的东西.
例如:我们编写一个简单的mytest.py
if __name__ == '__main__':
print ('cmd>>python mytest.py or Ctrl+Shift+F10 in pycharm IDE')
else:
print ('cmd>>import mytest or mytest.py is imported in another module')
以两种方式运行的结果:
$ python mytest.py
cmd>>python mytest.py or Ctrl+Shift+F10 in pycharm IDE
$ python
>>> import mytest
cmd>>import mytest or mytest.py is imported in another module
>>>
(3)__name__ == “__main__”的作用:用作为启动py文件的main函数入口;一个项目中必然会包含多个模块文件,每个模块文件在自己写完代码之后会做一些简单的测试用于检测bug 或者 对自己的函数调用写一个简单的示例,而恰到好处的是:__name__ == “__main__” 既不会影响你的测试代码,也不会影响别人调用你的接口函数。
二、python项目目录结构
在设计一个大型项目时,要规范目录结构。
Foo/
|-- bin/
| |-- foo
|
|-- foo/
| |-- tests/
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py
|
|-- docs/
| |-- conf.py
| |-- abc.rst
|
|-- setup.py
|-- requirements.txt
|-- README
简要解释一下:
1、bin/
: 存放项目的一些可执行文件,当然你可以起名script/
之类的也行。
2、foo/
: 存放项目的所有源代码。
(1) 源代码中的所有模块、包都应该放在此目录。不要置于顶层目录。
(2) 其子目录tests/
存放单元测试代码;
(3) 程序的入口最好命名为main.py
。
(4)__init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。
通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
3、docs/
: 存放一些文档。
4、setup.py
: 安装、部署、打包的脚本。
5、requirements.txt
: 存放软件依赖的外部Python包列表。
6、README
: 项目说明文件。