[英]Why can not we inspect the source code of the `__builtins__` module?
为什么我不能检查__builtins__
模块的源代码?
>>> import inspect
>>> inspect.getsource(__builtins__)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/inspect.py", line 701, in getsource
lines, lnum = getsourcelines(object)
File "/usr/lib/python2.7/inspect.py", line 690, in getsourcelines
lines, lnum = findsource(object)
File "/usr/lib/python2.7/inspect.py", line 526, in findsource
file = getfile(object)
File "/usr/lib/python2.7/inspect.py", line 403, in getfile
raise TypeError('{!r} is a built-in module'.format(object))
TypeError: <module '__builtin__' (built-in)> is a built-in module
我经历了这个谈话,但没有帮助。
如果我能很好地解释这一点,那就不会发生:
>>> help(inspect.getsource)
Help on function getsource in module inspect:
getsource(object)
Return the text of the source code for an object.
The argument may be a module, class, method, function, traceback, frame,
or code object. The source code is returned as a single string. An
IOError is raised if the source code cannot be retrieved.
您只能以这种方式检查Python源。 内置模块和使用C API编写的扩展模块中没有任何源,因此无法对其进行检查。 (当编译C代码时,结果可能包含一些调试信息,包括用于构建它的文件的本地路径名,但其中不包括实际的源文本。)
请注意,直接在文档中链接的函数上方, getsourcefile
表示:
如果对象是内置模块,类或函数,则将失败并显示
TypeError
。
而且,您可能会猜到(或可以通过查看docs链接的inspect.py
进行验证), getsourcefile
在getsource
使用了getsourcefile
。
如果您是在计算机上本地构建Python,并在构建后将源代码保留在那里,那么有一个项目可以找到用于构建每个模块的C源代码,但我找不到它(我认为它位于现在-长死不救的Berlios或Sourceforge),而且我认为它不会在2.4天后更新。
编写您自己的模块以在github存储库中查找源代码可能并不难,或者更好的是,在您自己的github存储库本地副本中查找源代码。 (这比依赖于本地构建的Python要好得多……)您甚至可以扩展它,以使用setuptools
信息来查找遵循某些常见模式的pip
安装的扩展模块的源。 但是据我所知,没有人发布过这样的模块。
如果您想自己构建类似的东西,请参阅此概念的快速和肮脏的证明 。 尽管您可能想使用git
或Github API而不是抓取,并且希望能够搜索本地存储库(如果找不到它,则可以克隆它)和/或在运行之间缓存内容,等等。 ,这既显示了它的简单性,又显示了它需要多少特殊外壳。
因此,最好的选择是克隆存储库并手动查找内容,或者直接在github上浏览。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.