Python网络爬虫实战(第2版)
上QQ阅读APP看书,第一时间看更新

2.5 Python代码格式

Python是一门新兴的编程语言,在格式方面与其他大众语言相差不大,但也有它独特之处,尤其是代码缩进。在其他的编程语言中,代码缩进大多是为了美观,程序、函数的开始结束都是由花括号来控制的。在Python中却不一样,程序、代码块的开始结束都是由缩进来控制的。所以,首先要熟悉的就是Python的代码缩进。

2.5.1 Python代码缩进

Python的缩进一般来说是4个空格,先严格按照这种缩进方法来写个测试代码。

     Class TestBlank(object):
     ----|----|def __init__(self):
     ----|----|----|----|self.timeout = 3
     ----|----|----|----|self.url = ‘’
     …………………………

以上的代码中----|代表4个空格。这才写了个开头就得40个空格。要是Python只能这样写,那还是选择C或者C++好了。好在还有备用方案,可以用Tab键来替代4个空格。这样的好处就是少按了很多次空格,坏处就是代码不好移植。在这台电脑上可以运行的程序,换台电脑可能就无法直接使用了。

既然变通了,那就变通到底好了。实际上这也是目前流行的做法,在自己的代码编辑器上将Tab键设置成4个空格就可以了。比如Windows下的notepad++就可以在“设置|首选项|语言”菜单中选中以空格替代。其他的Python IDE中都有类似的设定,自行摸索一下就可以了。Linux下一般用的都是vi,那就更加简单了。在/etc/vim/vimrc或者~/.vim/vimrc中添加代码:

     set ts=4
     set expandtab

提示

有的vi默认将tabstop定义成了8个空格。

Python每行代码前的缩进都有语法和逻辑上的意义。在严格要求的代码缩进之下,代码非常整齐规范,赏心悦目,提高了可读性,在一定程度上也提高了可维护性。

至于Python的缩进规则很简单。简单说就是,同一代码块纵向对齐。同级别函数(不存在调用关系的)纵向对齐,每次对齐都是4个空格的倍数。如果违反这些规则,Python是不会工作的,只会抛出一条冷冰冰的异常通知:SyntaxError: invalid syntax。

2.5.2 Python命名规则

对于给类、函数、变量取名,只要不违反命名规则,取任何名字都是可以的。要是不明白类、函数、变量的作用不是还有注释吗?的确是这样的。但如果能“望名生义”那又何必去添加多余的注释呢?另外,统一的命名法也令程序看起来赏心悦目。编写代码不能以书法让人愉悦,那就以名字和格式让人愉悦吧!

1. 匈牙利命名法

据说匈牙利命名法是一位叫Charles Simonyi的匈牙利程序员发明的,后来他在微软待了几年,于是这种命名法就通过微软的各种产品和文档资料向世界传播开了。这种命名法的出发点是把变量名按属性+类型+对象描述的顺序组合起来,以使程序员定义变量时对变量的类型和其他属性有直观的了解。

这种命名方法的确很好。可惜的是,Python的参数并不像C、C++、Java一样,声明变量无须指定变量类型。而且在没用到Python GUI编程前也不会遇到属性、对象什么的,所以这种命名法还是等到使用GUI编程时再使用吧。

2. 驼峰命名法

驼峰命名法又称骆驼式命名法(Camel-Case),是计算机程序编写时的一套命名规则(惯例)。正如它的名称CamelCase所表示的那样,是指混合使用大小写字母来构成变量和函数的名字。

驼峰式命名法就是当变量名或函式名是由一个或多个单词连在一起而构成的唯一识别字时,第一个单词以小写字母开始,第二个单词的首字母大写或每一个单词的首字母都采用大写字母,例如myFirstName、myLastName,这样的变量名看上去就像骆驼峰一样此起彼伏,故得名。驼峰命名法又可以分为小驼峰命名法和大驼峰命名法。

变量和函数一般用小驼峰法标识,即除第一个单词之外,其他单词首字母大写。譬如:

     def getUrl
     urlSrc = u'http://ww.baidu.com'

变量urlSrc第一个单词是全部小写,后面的单词首字母大写。

相比小驼峰法,大驼峰法把第一个单词的首字母也大写了,有时也被称为帕斯卡(pascal)命名法,常用于类名。譬如:

     Class MyLog(object):

3. Guido推荐的命名规则

Python之父Guido推荐在Python中使用的命名方法,如表2-2所示。

表2-2 PythonName

命名约定如下:

  • 所谓“内部(Internal)”表示仅模块内可用,或者在类内是保护或私有的。
  • 用单下划线(_)开头表示模块变量或函数是protected的(使用import * from时不会包含)。
  • 用双下划线(__)开头的实例变量或方法表示类内私有。
  • 将相关的类和顶级函数放在同一个模块里,不像Java,没必要限制一个类一个模块。
  • 对类名使用大写字母开头的单词(如CapWords,即Pascal风格),但是模块名应该用小写加下划线的方式(如lower_with_under.py),尽管已经有很多现存的模块使用类似于CapWords.py这样的命名,但现在已经不鼓励这样做,因为如果模块名碰巧和类名一致,就会让人困扰。

以上三种命名规则,可以任选一种或者组合使用,并没有强制要求。理论上来说,选择Python推荐的命名规则比较好,这也是Google推荐的Python命名规则。读者当然也可以不接受Google建议,选择自己喜欢的命名方法,只要自己能看懂,交流无障碍就可以了。

2.5.3 Python代码注释

一个好的程序员,为代码添加注释是编码时必须要做的,但要确保注释中要说明的都是重要的事情,让其他人看一眼就知道代码是干什么用的。注释在任何语言的代码中都非常重要,没有哪一种语言是完全不需要注释的。在Python中,注释还有其他的作用。Python中的注释分为特殊注释、单行注释和多行注释。

1. Python特殊注释

     #!/usr/bin/python3 env
     #-*- coding:utf-8 -*-

在所有的Python代码开头都有这两句(在Windows中写代码可以不用第一行注释,但为了移植方便,让程序能直接在Linux下运行还是加上这行比较好)。

以上特殊注释的第一行目的是指明Python编译器位置。第二行则指定了该程序使用的字符编码。指定字符编码还可以写成:

     #coding=utf-8

Python 3中默认的就是utf-8编码,但为了兼容Python 2还是加上这句比较好,Python 2使用的是ascii编码。

2. Python单行注释

单行注释很简单。不管在代码的任何位置,只要是#之后的都是注释,但仅限于本行之内,不得换行。单行注释的代码如下:

     self.timeout = 5  #网络超时时间
     self.fileName = './todayMovie.txt'  #保存文件的位置

单行注释不需要刻意对齐,避免出现SyntaxError: invalid syntax的异常。

3. Python多行注释

Python中的多行注释采取的是三个单引号'''或者三个双引号''''''。如果多行注释紧跟在定义类或者定义函数之后,则自动变成了该类或者函数的doc string。什么是doc string呢?简单地说就是模块、类、函数的功能注释。

【示例2-15】写一个简单的例子,一试就清楚了。打开Putty连接到Linux,执行命令:

     cd code/crawler
     vi annotation.py

annotation.py的代码如下:

      1 #!/usr/bin/env python3
      2 #-*- coding: utf-8 -*-
      3 __author__ = 'hstking hst_king@hotmail.com'
      4
      5 class Annotation(object):
      6     '''这是一个用户示范注释的类,
      7 多行注释如果在类或者函数的定义之后,
      8 将被默认成doc string。
      9 这里注释的是该类的功能性说明'''
     10     def __init__(self):
     11         self.run()
     12
     13     def run(self):
     14         """函数里的doc string,
     15 这里注释的是该函数的功能性说明
     16 注释用单引号和双引号没有任何区别 """
     17         x = 333 #定义了一个int类型的变量x
     18         print('x = %d' %x)
     19         '''好了,这里是单纯的注释了。可以注释多行,当然也可以注释单行了 '''
     20
     21
     22 if __name__ == '__main__':
     23     a = Annotation()

在annotation.py中,第17行使用的是单行注释,第19行使用的是多行注释,其他的则是类和函数的doc string。至于doc string怎么显示,也挺简单的。打开Putty连接到Linux,执行命令:

     cd code/crawler
     python3
     import annotation
     print(annotation.Annotation.__doc__)
     print(annotation.Annotation.run.__doc__)

执行结果如图2-26所示。

图2-26 注释和doc string

注释就介绍到这里。在编程时不加入注释,当时可能没什么问题,待到以后维护代码时就会发现那是相当痛苦的事情。