文件组织

python中模块的导入要用到import函数,若要导入自定的模块,若导入模块与运行文件在同一目录下,则直接输入导入模块的名字即可。若不在同一目录,则需要写出相对路径。模块可以看做是类和函数的集合。
查看模块搜索路径:sys.path

包 &库

一般认为一个’*.py’文件是一个module,为了python应用更具扩展性,我们可以多个模块(module)组织成文件层次,这就产生了包(package)

一个文件夹是一个package,一个package下可以有多个module,但是一个module只能属于一个package。

image.png
包的出现使得在创建模块时名字的冲突问题得以解决。需要注意的是在每个文件夹下都要建立一个_init__.py文件以保证Python将该文件夹所在的路径当做一个存在的包来处理,该文件夹可以是空的,也可以用来执行一些初始化代码或者声明全局 变量

Python中的库(library)是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。

导入模块/包

import语句除了支持import+package/module和直接import+*外,导入自定义的模块或者包要注明文件的路径。我们可以用".“和”…"分别表示当前节点和当前节点的父级节点,还以上边图片中的文件结构为例子,如果在surround文件中导入echo和equalizer,应该写为:

#absolute imports
from sound.effects import echo

#relative imports
from . import echo#这种情况直接写导入模块的名字即可
from ..filters import vocoder

使用pprint()友好输出

image.png

以主程序的方式运行

if  __name__='__main__':
...

在我们导入模块时,有可能在被导入模块的主程序中有其他的代码,但是在我们调用该模块时就可以检查一下__name__变量,如果该变量的值为__main__。则说明该模块并不是以被调用的模块来执行。这也避免了我们在调用该模块时自动运行该模块的主程序的问题。

logging程序日志模块

python的logging模块提供方法可以让我们使用程序日志logging功能。

logging的等级

logging打印的信息有五个等,从低到高等级顺序如下:
DEBUG:显示程序的小细节,可以用来追踪关键变量的变化过程
INFO:显示程序日志(程序一般发生的事件)
WARNING:
ERROR:程序在某些状态将引发错误的缘由
CRITICAL:显示让整个系统当掉或者中断的错误
在Python的默认显示中,只显示Warning及以上的层级

调整打印信息的层级

  • 可以通过logging.basicConfig(level=logging.DEBUG)来只显示不低于DEBUG层级的信息(如果设置为最高层级,那么就不会输出日志文件)
  • 可以通过logging.disable(level)停用level以下的所有层级

logger对象

image.png

格式化输出

可以在logging.basinConfig()方法内调节format参数来实现输出信息的调节:

logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-
%(levelname)s:
%(message)s')

格式化字符串的含义:

  • asctime:系统时间
  • levelname:记载显示层级
    image.png
  • message:某层级的输出信息,也可以用来追踪变量
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-
%(levelname)s:
%(message)s')
#相当于传递了一个message参数,内容需要自己指定

image.png
也可以用来追踪变量
image.png

输出到文件

通过指定logging.basicConfig()的filename参数,就可以把输出的认知给保存到指定文件中

代码测试

代码测试主要分为两方面的测试,一方面是代码风格的测试(换行注释以及报错等),另外一方面是对代码逻辑的测试(输出的值是否正确,边界是否考虑到位等)
测试代码.png

unittest

Python标准库提供了unittest来编写独立程序,一般情况下会测试程序编为单独的py文件,为了方便直接编在了一个文件中:

import unittest

# 一个简单的程序测试例子


class TestCap(unittest.TestCase):
def setUp(self):
#每个测试方法执行前进行的操作
print("Test begins")

def tearDown(self):
#每个测试方法执行后进行的操作

print('Test ends')

def test_one_word(self):
text = 'duck'
result = just_do_it(text)
self.assertEqual(result, 'Duck')

def test_more_word(self):
text = 'i have a big dream'
result = just_do_it(text)
self.assertEqual(result, 'I Have A Big Dream')


def just_do_it(text):

# 创建一个用来测试的函数
return text.capitalize()


if __name__ == '__main__':
unittest.main()

一般我们对一个函数进行测试时,会比较函数的返回值和期望输出(也叫断言)是否相同,在unittest中,可以使用assert(断言)开头的方法来检查返回的结果。

doctest

标注库的第二个测试包是doctest,它可以让我们把测试写在文档字符串中,也可以起到文档的作用。

import unittest

# 一个简单的程序测试例子


def just_do_it(text):
'''
>>>just_do_it('duck')
'Duck'
>>>just_do_it('i have a big dream')
'I Have A Big Dream'
'''
# 创建一个用来测试的函数
return text.capitalize()


if __name__ == '__main__':
import doctest
doctest.testmod()
# 在命令行窗口输入:python test_cap.py -v可以查看具体测试情况

调试代码

  • vars():提取本地变量的值

pdb调试器

python的标准调试器是pdb,在命令行输入python -m pdb test.py会启动程序并停在第一行,然后继续像命令行输入其他内容进行下一步操作:

  • c:让程序继续运行到正常结束或者出现错误
  • s:单步执行一行一行的代码(会进入函数内部,不进入的是n)
  • l:查看之后的几行(后加数字表示从第几行开始显示)
  • b 数字:设置断点
  • p var_name:打印变量的值

项目打包

python中有一个pyinstaller包,用来打包python项目,打包完成后生成一个exe文件,可以在其他没有python的电脑上运行,运行的时候会调用命令行窗口。

pyinstaller -F path_test.py
#-F表示只生成一个exe文件