Почему мы не можем проверить исходный код модуля `__builtins__`? - PullRequest
0 голосов
/ 27 апреля 2018

Почему я не могу проверить исходный код модуля __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 GitHub, как описано здесь и там .

1 Ответ

0 голосов
/ 27 апреля 2018

Таким способом можно проверить только источник Python . Встроенные модули и модули расширения, написанные с использованием C API, не содержат в себе никакого источника, поэтому нет возможности проверить его. (Когда вы компилируете код C, результат может иметь некоторую отладочную информацию, включая локальные имена файлов, использованных для его создания, но он не включает фактический исходный текст.)

Обратите внимание, что прямо над функцией, которую вы связали в документах, getsourcefile говорит:

Это не удастся с TypeError, если объект является встроенным модулем, классом или функцией.

И, как вы, вероятно, можете догадаться (или можете убедиться, посмотрев на inspect.py, связанный с документами), getsource использует getsourcefile под капотом.


Если вы собрали Python локально на своей машине и оставили исходный код там после сборки, есть проект, который может найти источники C, используемые для сборки каждого модуля, но я не могу его найти (я думаю, что он был включен теперь уже давно умерший Берлиос или Sourceforge), и я не думаю, что он когда-либо обновлялся после 2,4 дней.

Вероятно, не составит труда написать свой собственный модуль для поиска источника в репозитории github или, может быть, лучше в своем локальном клоне репозитория github. (Что было бы намного лучше, чем полагаться на локально построенный Python ...) Вы можете даже расширить его, чтобы использовать информацию setuptools для поиска источника для модулей расширения, установленных на pip, которые следуют определенным общим шаблонам. Но, насколько мне известно, никто не опубликовал такой модуль.

Если вы хотите создать что-то подобное, посмотрите это быстрое и грязное доказательство концепции . Хотя вы, вероятно, захотите использовать git или Github API вместо очистки, и вы захотите иметь возможность искать в локальном репо (возможно, клонировать его, если он не найден) и / или кэшировать вещи между запусками, и и так далее, это показывает, насколько это просто и сколько требуется специального корпуса.


Итак, лучший вариант - клонировать репозиторий и искать вещи вручную или просматривать непосредственно на github.

...