Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Latest commit

 

History

History
History
225 lines (139 loc) · 8.92 KB

File metadata and controls

225 lines (139 loc) · 8.92 KB
Copy raw file
Download raw file
Edit and raw actions

一切苦毒、恼恨、忿怒、嚷闹、毁谤,并一切的恶毒,都当从你们中间除掉。并要以恩慈相待,存怜悯的心,彼此饶恕,正如神在基督里饶恕了你们一样(EPHESIANS 4:31-32)

#标准库(1)

“python自带‘电池’”,听说过这种说法吗?

在python被安装的时候,就有不少模块也随着安装到本地的计算机上了。这些东西就如同“能源”、“电力”一样,让python拥有了无限生机,能够非常轻而易举地免费使用很多模块。所以,称之为“自带电池”。

它们被称为“标准库”。

熟悉标准库,是进行编程的必须。

##引用的方式

不仅是标准库的模块,所有模块都服从下述引用方式。

最基本的、也是最常用的,还是可读性非常好的:

import modulename

例如:

>>> import pprint
>>> a = {"lang":"python", "book":"www.itdiffer.com", "teacher":"qiwsir", "goal":"from beginner to master"}
>>> pprint.pprint(a)
{'book': 'www.itdiffer.com',
 'goal': 'from beginner to master',
 'lang': 'python',
 'teacher': 'qiwsir'}

在对模块进行说明的过程中,我以标准库pprint为例。以pprint.pprint()的方式应用了一种方法,这种方法能够让dict格式化输出。看看结果,是不是比原来更容易阅读了你?

在import后面,理论上可以跟好多模块名称。但是在实践中,我还是建议大家一次一个名称吧。这样简单明了,容易阅读。

这是用import pprint样式引入模块,并以.点号的形式引用其方法。

还可以:

>>> from pprint import pprint

意思是从pprint模块中之将pprint()引入,然后就可以这样来应用它:

>>> pprint(a)
{'book': 'www.itdiffer.com',
 'goal': 'from beginner to master',
 'lang': 'python',
 'teacher': 'qiwsir'}

再懒惰一些,可以:

>>> from pprint import *

这就将pprint模块中的一切都引入了,于是可以像上面那样直接使用每个函数。但是,这样造成的结果是可读性不是很好,并且,有用没用的都拿过来,是不是太贪婪了?贪婪的结果是内存就消耗了不少。所以,这种方法,可以用于常用并且模块属性或方法不是很多的情况。

诚然,如果很明确使用那几个,那么使用类似from modulename import name1, name2, name3...也未尝不可。一再提醒的是不能因为引入了模块东西而降低了可读性,让别人不知道呈现在眼前的方法是从何而来。如果这样,就要慎用这种方法。

有时候引入的模块或者方法名称有点长,可以给它重命名。如:

>>> import pprint as pr
>>> pr.pprint(a)
{'book': 'www.itdiffer.com',
 'goal': 'from beginner to master',
 'lang': 'python',
 'teacher': 'qiwsir'}

当然,还可以这样:

>>> from pprint import pprint as pt
>>> pt(a)
{'book': 'www.itdiffer.com',
 'goal': 'from beginner to master',
 'lang': 'python',
 'teacher': 'qiwsir'}

但是不管怎么样,一定要让人看懂,过了若干时间,自己也还能看懂。记住:“软件很多时候是给人看的,只是偶尔让机器执行”。

##深入探究

继续以pprint为例,深入研究:

>>> import pprint
>>> dir(pprint)
['PrettyPrinter', '_StringIO', '__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '_commajoin', '_id', '_len', '_perfcheck', '_recursion', '_safe_repr', '_sorted', '_sys', '_type', 'isreadable', 'isrecursive', 'pformat', 'pprint', 'saferepr', 'warnings']

对dir()并不陌生。从结果中可以看到pprint的属性和方法。其中有不少是双划线、电话线开头的。为了不影响我们的视觉,先把它们去掉。

>>> [ m for m in dir(pprint) if not m.startswith('_') ]
['PrettyPrinter', 'isreadable', 'isrecursive', 'pformat', 'pprint', 'saferepr', 'warnings']

对这几个,为了能够搞清楚它们的含义,可以使用help(),比如:

>>> help(isreadable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'isreadable' is not defined

这样做是错误的。知道错在何处吗?

>>> help(pprint.isreadable)

别忘记了,我前面是用import pprint方式引入模块的。

Help on function isreadable in module pprint:

isreadable(object)
    Determine if saferepr(object) is readable by eval().

通过帮助信息,能够查看到该方法的详细说明。可以用这种方法一个一个地查过来,反正也不多,对每个方法都熟悉一些。

注意的是pprint.PrettyPrinter是一个类,后面的是函数(方法)。

在回头看看dir(pprint)的结果,关注一个:

>>> pprint.__all__
['pprint', 'pformat', 'isreadable', 'isrecursive', 'saferepr', 'PrettyPrinter']

这个结果是不是眼熟?除了"warnings",跟前面通过列表解析式得到的结果一样。

其实,当我们使用from pprint import *的时候,就是将__all__里面的方法引入,如果没有这个,就会将其它所有属性、方法等引入,包括那些以双划线或者单划线开头的变量、函数,这些东西事实上很少被在引入模块时使用。

##帮助、文档和源码

不知道读者是否能够记住看过的上述内容?反正我记不住。所以,我非常喜欢使用dir()和help(),这也是本教程从开始到现在,乃至到以后,总在提倡的方式。

>>> print pprint.__doc__
Support to pretty-print lists, tuples, & dictionaries recursively.

Very simple, but useful, especially in debugging data structures.

Classes
-------

PrettyPrinter()
    Handle pretty-printing operations onto a stream using a configured
    set of formatting parameters.

Functions
---------

pformat()
    Format a Python object into a pretty-printed representation.

pprint()
    Pretty-print a Python object to a stream [default is sys.stdout].

saferepr()
    Generate a 'standard' repr()-like value, but protect against recursive
    data structures.

pprint.__doc__是查看整个类的文档,还知道整个文档是写在什么地方的吗?

关于文档的问题,曾经在《类(5)》《自省》中有介绍。但是,现在出现的是模块文档。

还是使用pm.py那个文件,增加如下内容:

#!/usr/bin/env python
# coding=utf-8

"""                                          #增加的
This is a document of the python module.     #增加的
"""                                          #增加的

def lang():
    ...                                      #省略了,后面的也省略了

在这个文件的开始部分,所有类和方法、以及import之前,写一个用三个引号包括的字符串。那就是文档。

>>> import sys
>>> sys.path.append("~/Documents/VBS/StarterLearningPython/2code")
>>> import pm
>>> print pm.__doc__

This is a document of the python module.

这就是撰写模块文档的方法,即在.py文件的最开始写相应的内容。这个要求应该成为开发习惯。

python的模块,不仅可以看帮助信息和文档,还能够查看源码,因为它是开放的。

还是回头到dir(pprint)中找一找,有一个__file__,它就告诉我们这个模块的位置:

>>> print pprint.__file__
/usr/lib/python2.7/pprint.pyc

我是在ubuntu中为例,读者要注意观察自己的操作系统结果。

虽然是.pyc文件,但是不用担心,根据现实的目录,找到相应的.py文件即可。

$ ls /usr/lib/python2.7/pp*
/usr/lib/python2.7/pprint.py  /usr/lib/python2.7/pprint.pyc

果然有一个pprint.py。打开它,就看到源码了。

$ cat /usr/lib/python2.7/pprint.py

...

"""Support to pretty-print lists, tuples, & dictionaries recursively.

Very simple, but useful, especially in debugging data structures.

Classes
-------

PrettyPrinter()
    Handle pretty-printing operations onto a stream using a configured
    set of formatting parameters.

Functions
---------

pformat()
    Format a Python object into a pretty-printed representation.

....
"""

我只查抄了文档中的部分信息,是不是跟前面通过__doc__查看的结果一样一样的呢?

请读者在闲暇时间,阅读以下源码。事实证明,这种标准库中的源码是质量最好的。


总目录   |   上节:编写模块   |   下节:标准库(2)

如果你认为有必要打赏我,请通过支付宝:qiwsir@126.com,不胜感激。

Morty Proxy This is a proxified and sanitized view of the page, visit original site.