项目创建(代码规范)

2022-09-05 17:56:45 浏览数 (1)

模块导入

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参数来实现输出信息的调节:

代码语言:javascript复制
logging.basicConfig(level=logging.DEBUG,format='%(asctime)s-
                    %(levelname)s:
                    %(message)s')

格式化字符串的含义:

  • asctime:系统时间
  • levelname:记载显示层级
  • message:某层级的输出信息,也可以用来追踪变量
代码语言:javascript复制
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文件

0 人点赞