模块导入
python中模块的导入要用到import函数,若要导入自定的模块,若导入模块与运行文件在同一目录下,则直接输入导入模块的名字即可。若不在同一目录,则需要写出相对路径。模块可以看做是类和函数的集合。
查看模块搜索路径–sys.path
包
为了python应用更具扩展性,我们可以多个模块组织成文件层次,这就产生了包。 在对模块打包后再调用模块时,一般要输入:
代码语言:javascript复制import package.module names
包的出现使得在创建模块时名字的冲突问题得以解决。需要注意的是在每个文件夹下都要建立一个_init__.py文件以保证Python将该文件夹所在的路径当做一个存在的包来处理,该文件夹可以是空的,也可以用来执行一些初始化代码或者声明全局 变量
跨路径导入模块/包
import语句除了支持import package/module和直接import *外,导入自定义的模块或者包要注明文件的路径。我们可以用".“和”…"分别表示当前节点和当前节点的父级节点,还以上边图片中的文件结构为例子,如果在surround文件中导入echo和equalizer,应该写为:
代码语言:javascript复制#absolute imports
from sound.effects import echo
#relative imports
from . import echo#这种情况直接写导入模块的名字即可
from ..filters import vocoder
库
Python中的库是借用其他编程语言的概念,没有特别具体的定义,Python库着重强调其功能性。在Python中,具有某些功能的模块和包都可以被称作库。模块有诸多函数组成,包由诸多模块机构化组成,库中也可以包含包、模块和函数。
使用pprint()友好输出
以主程序的方式运行
代码语言:javascript复制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对象
格式化输出
可以在logging.basinConfig()
方法内调节format参数来实现输出信息的调节:
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-
%(levelname)s:
%(message)s')
格式化字符串的含义:
- asctime:系统时间
- levelname:记载显示层级
- message:某层级的输出信息,也可以用来追踪变量
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-
%(levelname)s:
%(message)s')
#相当于传递了一个message参数,内容需要自己指定
也可以用来追踪变量
输出到文件
通过指定logging.basicConfig()
的filename参数,就可以把输出的认知给保存到指定文件中
代码测试
代码测试主要分为两方面的测试,一方面是代码风格的测试(换行注释以及报错等),另外一方面是对代码逻辑的测试(输出的值是否正确,边界是否考虑到位等)
unittest
Python标准库提供了unittest来编写独立程序,一般情况下会测试程序编为单独的py文件,为了方便直接编在了一个文件中:
代码语言:javascript复制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,它可以让我们把测试写在文档字符串中,也可以起到文档的作用。
代码语言:javascript复制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的电脑上运行,运行的时候会调用命令行窗口。
代码语言:javascript复制pyinstaller -F path_test.py
#-F表示只生成一个exe文件