python代码文件结构和项目目录结构

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: 项目说明文件。

你可能感兴趣的:(python)