获取Python中所有函数、类和数据类型。

3

我正在开发一个小型的 Python 学习应用程序。学生只需搜索关键字,例如:listdate,我的应用程序就会输出关键字的帮助文本。

首先,我想使用 help() 函数将所有 Python 内置类和函数的帮助文本提取到 JSON 文件中。我尝试过:

>>> import sys
>>> sys.modules.keys()
['__future__', 'copy_reg', 'sre_compile', '_hashlib', '_sre', 'encodings', 'site', '__builtin__', 'datetime', '__main__', 'encodings.encodings', 'hashlib', 'abc', 'posixpath', '_random', '_weakrefset', 'errno', 'binascii', 'encodings.codecs', 'sre_constants', 're', '_abcoll', 'types', '_codecs', '_warnings', 'math', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'codecs', 'readline', 'os.path', '_locale', 'sitecustomize', 'signal', 'random', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'sre_parse', 'os', '_weakref']

通过以上结果,我可以提取:
>>> bi = sys.modules.get('__builtin__')
>>> help(bi.list.append) (or)
>>> bi.list.append.__doc__
'L.append(object) -- append object to end'  # goes to json file

sys.modules给出了rerandom等,但在以上模块列表中我没有找到datetime。怎样从Python中找到所有可用的函数、数据类型、类等?

注意:我的目标是尽可能多地从Python中提取帮助文本。不仅仅是sys.modules,任何方法都可以受益。

编辑:一开始没有datetime

>>> import sys
>>> sys.modules.keys()
['copy_reg', 'encodings', 'site', '__builtin__', '__main__', 'encodings.encodings', 'abc', 'posixpath', '_weakrefset', 'errno', 'encodings.codecs', '_abcoll', 'types', '_codecs', '_warnings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'codecs', 'readline', 'os.path', 'sitecustomize', 'signal', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'os', '_weakref']

引入datetime和sys.modules之后

>>> import datetime
>>> sys.modules.keys()
['copy_reg', 'encodings', 'site', '__builtin__', 'datetime', '__main__', 'encodings.encodings', 'abc', 'posixpath', '_weakrefset', 'errno', 'encodings.codecs', '_abcoll', 'types', '_codecs', '_warnings', 'genericpath', 'stat', 'zipimport', 'encodings.__builtin__', 'warnings', 'UserDict', 'encodings.utf_8', 'sys', 'codecs', 'readline', 'os.path', 'sitecustomize', 'signal', 'linecache', 'posix', 'encodings.aliases', 'exceptions', 'os', '_weakref']
>>> 

2
我可以在你的结果中看到 datetime。第九个索引。 - Mazdak
1
在我的机器上,sys.modules中没有'datetime'。 - Brian
1
为什么你想要“尽可能提取帮助文本”?所有的信息都在文档中。 - jonrsharpe
顺便提一下,您可以通过交互式帮助命令help()获取模块列表和其他有用信息,您可以在交互式解释器中运行该命令,或通过脚本运行。还有pydoc命令可供使用。 - PM 2Ring
1
那并没有真正回答我的问题... - jonrsharpe
显示剩余2条评论
2个回答

3

datetime 是标准库的一部分;它的 datetime.datetime 类型不像列表那样是一个内置类型

如果您仍然坚持迭代 sys.modules 而不是 查找它, 通常 同样交互式地, 您可能需要诉诸于 导入所有标准库: import sys

from stdlib_list import stdlib_list

for lib in stdlib_list("2.7"):
    try:
        __import__(lib)
    except ImportError:
        continue

assert 'datetime' in sys.modules

print sys.modules.get('datetime').datetime.__doc__
# datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])
#
# The year, month and day arguments are required. tzinfo may be None, or an
# instance of a tzinfo subclass. The remaining arguments may be ints or longs.

0

您似乎想要创建自己的help()版本,一种您认为更适合学生使用的版本。如果是这样,也许您可以从原始版本开始。您可以查看pydoc.py的源代码(可以在类似C:/Python34/lib/pydoc.py的位置找到),其中定义了help()。例如,帮助方法的实际代码如下:

def help(self, request):
        if type(request) is type(''):
            request = request.strip()
            if request == 'help': self.intro()
            elif request == 'keywords': self.listkeywords()
            elif request == 'symbols': self.listsymbols()
            elif request == 'topics': self.listtopics()
            elif request == 'modules': self.listmodules()

(接下来是几个elif子句)

你可以开始深入研究listkeywords(self)等代码。

一旦你理解了help()如何定位它的主题,那么你就可以决定使用哪一个。

顺便说一句——上面的代码片段表明,在shell中简单地键入help('keywords')等内容将大大有助于回答你的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接