2.3. typestr,dir,和其它内置函数

Python有小部分相当有用的内置函数。其它的所有函数都划分到不同的模块中去了。这一点实际上是有意识的设计决定,是为了保证核心语言避免象其它脚本语言一样变得臃肿(咳,咳,VB)。

type 函数返回任意对象的数据类型。可能的类型列在了 types 模块内。这些类型对帮助者(helper)函数有用,可以处理几种数据类型。

例 2.6. type 介绍

>>> type(1)           1
<type 'int'>
>>> li = []
>>> type(li)          2
<type 'list'>
>>> import odbchelper
>>> type(odbchelper)  3
<type 'module'>
>>> import types      4
>>> type(odbchelper) == types.ModuleType
1
1

type 接收任何事物,并且返回它的数据类型。我的意思是任何东西。整数,字符串,列表,字典,序列,函数,类,模块,甚至类型。

2 type 可以接收变量并返回它的数据类型。
3 type 也可以用于模块。
4

你可以使用 types 模块中的常量用来比较对象的类型。这就是 help 函数所做的,这一点很快会看到。

str 强制将数据转化为字符串。每一种数据类型都可以被转化为字符串。

例 2.7. str 介绍

>>> str(1)          1
'1'
>>> horsemen = ['war', 'pestilence', 'famine']
>>> horsemen.append('Powerbuilder')
>>> str(horsemen)   2
"['war', 'pestilence', 'famine', 'Powerbuilder']"
>>> str(odbchelper) 3
"<module 'odbchelper' from 'c:\\docbook\\dip\\py\\odbchelper.py'>"
>>> str(None)       4
'None'
1 对于象整数这样的简单类型,你会认为 str 可以工作,因为几乎每一种语言都有一个用来将整数据转化为字符串的函数。
2

然而 str 可工作于任何类型的任何对象。这里它应用于一个我们零碎构造的列表。

3

str 也可用于模块。注意,模块的字符串表示包含了模块在磁盘上的路径,所以你的结果看上去可能不一样。

4

str 的一个细小但很重要的行为是它可以用于 None,Python空值。它返回字符串 'None'。我们将应用这一点在 help 函数中来满足我们的需要,这一点我们很快会看到。

help 函数的核心是强大的 dir 函数。dir 返回任意一个对象的属性和方法的列表:模块,函数,字符串,列表,字典...相当多的东西。

例 2.8. dir 介绍

>>> li = []
>>> dir(li)           1
['append', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>> d = {}
>>> dir(d)            2
['clear', 'copy', 'get', 'has_key', 'items', 'keys', 'setdefault', 'update', 'values']
>>> import odbchelper
>>> dir(odbchelper)   3
['__builtins__', '__doc__', '__file__', '__name__', 'buildConnectionString']
1

li 是一个列表,所以 dir(li) 返回列表所有方法的一个列表。注意返回的列表包含着字符串表示的方法的名字,而不是方法自身。

2

d 是一个字典,所以 dir(d) 返回字典方法的名字的列表。其中至少有一个方法,keys,应该看上去熟悉。

3

这里就是真正变得有趣的地方。odbchelper 是一个模块,所以 dir(odbchelper) 返回在模块中定义的所有东西的列表,包括内置属性,象 __name____doc__,和你定义的属性和方法其它什么的。在这个例子中,odbchelper 仅有一个用户自定义方法,buildConnectionString 函数,我们在开始了解Python中学过的。

最后,callable 函数接收一个对象,并当对象可以调用时返回 1 ,其它情况下返回 0 。可调用对象包括函数、类方法,至甚是类本身。(更多关于类的内容在第三章)

例 2.9. callable 介绍

>>> import string
>>> string.punctuation           1
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
>>> string.join                  2
<function join at 00C55A7C>
>>> callable(string.punctuation) 3
0
>>> callable(string.join)        4
1
>>> print string.join.__doc__    5
join(list [,sep]) -> string

    Return a string composed of the words in list, with
    intervening occurrences of sep.  The default separator is a
    single space.

    (joinfields and join are synonymous)
1 string 中的函数不受重视(尽管许多人仍然使用 join 函数),但是这个模块包含了大量有用的常量,象 string.punctuation,它包含了所有标准的标点符号字符。
2 string.join 是一个可以将字符串列表连接的函数。
3 string.punctuation 不是一个可调用对象,它是一个字符串。(字符串的确有可调用的方法,但字符串本身是不可调用的。)
4 string.join 是可调用的,它是一个接收两个参数的函数。
5 任何可调用对象都可以有一个文档字符串。对一个对象的每个属性都使用 callable 函数,就可以不用事先了解对象,我们就可以决定哪些属性是我们所关心的(方法、函数、类),哪些属性是我们想忽略的(常量,等等)。

typestrdir,和所有其它的Python内置函数被组合进一个名叫 __builtins__ 的特别模块中。(它在前后有两个下划线。)如果有帮助的话,你可以认为Python在启动时自动地执行 from __builtins__ import * ,这样就导入了所有内置的函数到名字空间中,所以你可以直接使用它们。

象这样考虑的好处是,你可以通过得到 __builtins__ 的信息,作为一个组,存取所有内置的函数和属性。猜到什么了吗?我们有一个实现那个功能的函数,它叫做 help。自已试一下然后现在完全忽略列表;在后面我们将深入到一些更重要的功能。(一些内置错误类,象 AttributeError,应该看上去已经熟悉了。)

例 2.10. 内置属性和函数

>>> from apihelper import help
>>> help(__builtins__, 20)
ArithmeticError      Base class for arithmetic errors.
AssertionError       Assertion failed.
AttributeError       Attribute not found.
EOFError             Read beyond end of file.
EnvironmentError     Base class for I/O related errors.
Exception            Common base class for all exceptions.
FloatingPointError   Floating point operation failed.
IOError              I/O operation failed.

[...snip...]
Note

Python附带了出色的参考手册,你应该十分仔细地阅读它们,学习Python所提供的所有的模块。对于大多数语言,你会发现自已要经常回头参考手册(或man文档,或上帝来帮助你,MSDN)来提醒自已如何使用这些模块,而Python大部分是自我文档化的。


进一步阅读