Python 探索Python的模块和对象,在Python解释器中可以直接交互式地探索模块和对象。这是一个被低估的特性,很容易被忽略,特别是对于刚刚从另一门语言切换到Python的人来说,更是如此。
对于许多编程语言来说,如果不查阅在线文档或认真学习接口定义,那么很难了解包或类的内部内容。
Python就不一样,高效的开发人员会花费大量时间在Python的REPL会话中交互式地使用解释器。我就经常在REPL会话中编写小段代码,然后将其复制粘贴到编辑器正在处理的Python文件中。
本节将介绍两种用于在解释器中交互式地探索Python类和方法的简单技巧。
这些技巧可用于以任何方式安装的Python,只需要在命令行中使用python
命令启动Python解释器即可。这特别适合在无法使用高级编辑器或IDE的系统上调试会话,比如在终端会话中通过网络工作(ssh)。
准备好了吗?让我们开始吧!假设你正在编写一个程序,它使用Python标准库中的datetime
模块。那么如何确定这个模块能导出哪些函数或类,以及这些类中有哪些方法和属性呢?
一种方法是使用搜索引擎或在网上查找官方的Python文档,而使用Python内置的dir()
函数能直接在Python REPL中访问这些信息:
>>> import datetime
>>> dir(datetime)
['MAXYEAR', 'MINYEAR', '__builtins__', '__cached__',
'__doc__', '__file__', '__loader__', '__name__',
'__package__', '__spec__', '_divide_and_round',
'date', 'datetime', 'datetime_CAPI', 'time',
'timedelta', 'timezone', 'tzinfo']
在上面的例子中,首先从标准库导入datetime
模块,然后用dir()
函数查看这个模块。在模块上调用dir()
可以得到按字母顺序排列的名称和属性列表。
由于Python中的一切皆为对象,因此这个技巧不仅适用于模块本身,还可用于模块导出的类和数据结构。
事实上,还可以对感兴趣的对象继续调用dir()
。例如下面查看了datetime.date
类:
>>> dir(datetime.date)
['__add__', '__class__', ..., 'day', 'fromordinal',
'isocalendar', 'isoformat', 'isoweekday', 'max', 'min',
'month', 'replace', 'resolution', 'strftime',
'timetuple', 'today', 'toordinal', 'weekday', 'year']
从中可以看到,dir()
能够让你快速浏览模块或类中可用的内容。如果不记得某个特定类或函数的确切拼写,使用dir()
无须中断当前编码流程就能查看相关信息。
在复杂的模块或类这样的对象上调用dir()
时,有时可能会产生冗长且难以快速阅读的输出内容。可以用下面这个小技巧过滤出感兴趣的属性列表:
>>> [_ for _ in dir(datetime) if 'date' in _.lower()]
['date', 'datetime', 'datetime_CAPI']
这里使用列表解析式来过滤dir(datetime)
调用的结果,仅显示包含单词date的名称。注意,我在每个名称上都调用了lower()
方法,以确保过滤时不区分大小写。
仅列出对象的属性有时并不足以解决手头的问题。那么关于datetime
模块导出的函数和类,怎样才能获得更多、更详细的信息呢?
可以使用Python内置的help()
函数,以在Python的交互式帮助系统中浏览所有Python对象自动生成的文档:
>>> help(datetime)
如果在Python解释器会话中运行上述示例,那么终端将显示基于文本的帮助页面,其中有datetime
模块的相关信息,如下所示:
Help on module datetime:
NAME
datetime - Fast implementation of the datetime type.
CLASSES
builtins.object
date
datetime
time
使用光标上下键能滚动文档。按空格键会一次向下滚动几行。按q键会退出交互式帮助模式,回到解释器会话中。很不错的功能,对吧?
顺便说一句,可以在所有Python对象上调用help()
,包括其他内置函数和自定义的Python类。Python解释器会根据对象及其文档字符串(如果有的话)自动生成帮助文档。下面的help()
函数使用方式都是正确的:
>>> help(datetime.date)
>>> help(datetime.date.fromtimestamp)
>>> help(dir)
当然,dir()
和help()
还是比不上格式良好的HTML文档、搜索引擎或Stack Overflow。但这两个函数可用来在不离开Python解释器的情况下快速查找相关内容,同时还可以脱机使用,在特定情况下非常有用。
关键要点
-
使用内置的
dir()
函数可以在Python解释器会话中交互式地探索模块和类。 -
内置的
help()
函数可用来直接在解释器中浏览文档(按q键退出)。