为什么我们不能检查 `__builtins__` 模块的源代码?

Bil*_*adj 1 python built-in inspect

为什么我不能检查__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
Run Code Online (Sandbox Code Playgroud)

我经历了这个 谈话,但没有帮助。

如果我解释得很好,这不应该发生:

>>> 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.
Run Code Online (Sandbox Code Playgroud)

除了像这里那里描述的那样浏览 Python GitHub 存储库之外,没有办法克服这个问题。

aba*_*ert 6

你只能检查Python这种方式源代码。使用 C API 编写的内置模块和扩展模块中没有任何源代码,因此无法对其进行检查。(编译 C 代码时,结果可能包含一些调试信息,包括用于构建它的文件的本地路径名,但不包括实际的源文本。)

请注意,在您在文档中链接的函数正上方,getsourcefile说:

TypeError如果对象是内置模块、类或函数,这将失败。

而且,正如您可能猜到的(或者可以通过查看inspect.py从文档中链接的进行验证),在幕后getsource使用getsourcefile


如果你在你的机器上本地构建 Python,并在构建后将源代码留在那里,那么有一个项目可以找到用于构建每个模块的 C 源代码,但我找不到它(我认为它是在现在 - Berlios 或 Sourceforge),而且我认为它在 2.4 天左右之后就再也没有更新过。

编写自己的模块以在 github 存储库中查找源代码可能不会太难,或者在您自己的 github 存储库的本地克隆中查找源代码可能会更好。(这比依赖本地构建的 Python 好得多……)您甚至可以扩展它以使用setuptools信息来查找源代码pip遵循某些常见模式的已安装扩展模块的。但是,据我所知,没有人发布过这样的模块。

如果你想自己构建这样的东西,请参阅这个快速而肮脏的概念证明。尽管您可能希望使用gitGithub API 或 Github API 而不是抓取,并且您希望能够搜索本地存储库(如果未找到,可能会克隆它)和/或在运行之间缓存内容,等等,这表明它是多么容易,以及它需要多少特殊外壳。


因此,最好的选择是克隆 repo 并手动查找内容,或直接在 github 上浏览。