python的语言风格(一)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41679411/article/details/79176649

python的语言风格(一)

从本文开始,笔者将介绍一些python的语言风格,利用这些方式去编写代码、组织逻辑将事半功倍。有兴趣的朋友可以阅读Guido van Rossum的文章www.Python.org/dev/peps/pep-0020/

模块结构和布局:

用模块结构来合理组织你的Python代码是简单又自然的方法。你应该建立一种统一且容易阅读的结构,并将它应用到每一个文件中去。下面就是一种非常合理地布局:
# (1) 起始行(Unix)
# (2) 模块文档
# (3) 模块导入
# (4) 变量定义
# (5) 类定义
# (6) 函数定义
# (7) 主程序

(1) 起始行
通常只有在类Unix 环境下才使用起始行,有起始行就能够仅输入脚本名字来执行脚本,无需直接调用解释器。
(2)模块文档
简要介绍模块的功能及重要全局变量的含义,模块外可通过 module.__doc__ 访问这些内容。
(3)模块导入
导入当前模块的代码需要的所有模块;每个模块仅导入一次(当前模块被加载时);函数内部的模块导入代码不会被执行, 除非该函数正在执行。
(4)变量定义
这里定义的变量为全局变量,本模块中的所有函数都可直接使用。从好的编程风格角度说,除非必须,否则就要尽量使用局部变量代替全局变量,如果坚持这样做,你的代码就不但容易维护,而且还可以提高性能并节省内存。
(5)类定义语句
所有的类都需要在这里定义。当模块被导入时class 语句会被执行, 类也就会被定义。类的文档变量是class.__doc__。
(6)函数定义语句
此处定义的函数可以通过module.function()在外部被访问到,当模块被导入时 def 语句
会被执行, 函数也就都会定义好,函数的文档变量是function.__doc__。
(7) 主程序
无论这个模块是被别的模块导入还是作为脚本直接执行,都会执行这部分代码。通常这里
不会有太多功能性代码,而是根据执行的模式调用不同的函数。

下面以一段代码来具体说明
代码块语法遵循标准markdown代码,例如:

#/usr/bin/env python

"this is a test module"

import sys
import os

debug = True

class FooClass (object):
    "Foo class"
    pass

def test():
    ''test function''
    foo = FooClass()
    if debug:
        print 'ran test()'

if __name__ == '__main__':
    test()    

推荐代码风格:主程序调用main()函数主程序代码通常都和你前面看到的代码相似,检查 __name__ 变量的值然后再执行相应的调用。主程序中的代码通常包括变量赋值, 类定义和函数定义,随后检查__name__来决定是否调用另一个函数(通常调用main()函数)来完成该模块的功能。主程序通常都是做这些事。不管用什么名字,我们想强调一点那就是:这儿是放置测试代码的好地方。

很多项目都是一个主程序,由它导入所有需要的模块。所以请记住,绝大部分的模块创建的目的是为了被别人调用而不是作为独立执行的脚本。我们也很可能创建一个Python 库风格的模块,这种模块的创建目的就是为了被其他模块调用。总之,只有一个模块,也就是包含主程序的模块会被直接执行,或由用户通过命令行执行,或作为批处理执行, 或由Unix cron 任务定时执行,或通过Web 服务器调用,或通过GUI 执行。

时刻记住一个事实,那就是所有的模块都有能力来执行代码。最高级别的Python 语句,也就是说, 那些没有缩进的代码行在模块被导入时就会执行, 不管是不是真的需要执行。由于有这样一个“特性”,比较安全的写代码的方式就是除了那些真正需要执行的代码以外, 几乎所有的功能代码都在函数当中。再说一遍, 通常只有主程序模块中有大量的顶级可执行代码,所有其它被导入的模块只应该有很少的顶级执行代码,所有的功能代码都应该封装在函数或类当中。

在主程序中书写测试代码

优秀的程序员和软件工程师,总是会为我们的应用程序提供一组测试代码或者简单教程。对那些仅仅为了让别的程序导入而创建的模块来说, Python 有效的简化了这个任务。这些模块理论上永远不会被直接执行, 那么,在这个模块被直接执行时进行系统测试岂不妙哉? 设置起来难吗? 一点儿也不。

测试代码仅当该文件被直接执行时运行, 也就是说不是被别的模块导入时。上文及核心笔记中提到如何判断一个模块是被直接运行还是被导入。我们应该利用 __name__ 变量这个有利条件。将测试代码放在一个或者叫main(), 或者叫test()(或者你随便取个啥名字)的函数中,如果该模块是被当成脚本运行, 就调用这个函数。

这些测试代码应该随着测试条件及测试结果的变更及时修改, 每次代码更新都应该运行这些测试代码,以确认修改没有引发新问题。只要坚持这样做,你的代码就会足够健壮,更不用提验证和测试新特性和更新了。

相关模块和开发工具

Python 代码风格指南(PEP8), Python 快速参考和Python 常见问答都是开发者很重要的“工具”。另外, 还有一些模块会帮助你成为一个优秀的Python 程序员。

  • Debugger: pdb
  • Logger:logging
  • Profilers:profile,hotshot,cProfile

调试模块 pdb 允许你设置(条件)断点,代码逐行执行,检查堆栈。它还支持事后调试。

logging 模块是在 Python2.3 中新增的, 它定义了一些函数和类帮助你的程序实现灵活的日志系统。共有五级日志级别: 紧急, 错误,警告,信息和调试。

猜你喜欢

转载自blog.csdn.net/weixin_41679411/article/details/79176649