Как посмотреть код библиотеки python
Перейти к содержимому

Как посмотреть код библиотеки python

Как просмотреть исходный код стандарнтного модуля Python?

user avatar

Если модуль на питоне, то он лежит в папке Lib установленного питона, но часть модулей на С.

Питоновские модули, естественно, доступны во всех отладчиках, можно просто в отладке войти внутрь и смотреть код по мере выполнения.

user avatar

Всё ещё ищете ответ? Посмотрите другие вопросы с метками python или задайте свой вопрос.

Site design / logo © 2022 Stack Exchange Inc; user contributions licensed under cc by-sa. rev 2022.6.10.42345

Нажимая «Принять все файлы cookie», вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как я могу увидеть исходный код встроенных методов Python? [Дубликат]

Для модулей, классов, функций и нескольких других объектов вы можете использовать inspect.getfile или inspect.getsourcefile . Однако для встроенных объектов и методов это приведет к TypeError . Как полагают C0deH4cker, встроенные объекты и методы реализованы на C, поэтому вам нужно будет просмотреть исходный код C. isdigit — метод встроенного строкового объекта, который реализован в файле stringobject.c в каталоге Objects исходного кода Python. Этот метод isdigits реализуется из строки 3392 этого файла. См. Также мой ответ здесь на аналогичный, но более общий вопрос.

Метод isdigit() , о котором вы говорите, является встроенным методом встроенного типа данных. Смысл, источник этого метода написан на C, а не на Python. Если вы действительно хотите увидеть исходный код, я предлагаю вам перейти на http://python.org и загрузить исходный код Python.

Хотя я обычно соглашался с тем, что inspect является хорошим ответом, он падает, когда ваш класс (и, следовательно, метод класса) был определен в интерпретаторе.

Если вы используете dill.source.getsource из dill вы можете получить источник функций и лямбда, даже если они определены интерактивно. Он также может получить код для связанных или несвязанных методов и функций класса, определенных в карри . однако вы не сможете скомпилировать этот код без кода объекта-объекта.

Для builtin , функции dill.source не будут работать . HOWEVER .

Вам все равно не придется прибегать к использованию вашего любимого редактора, чтобы открыть файл с исходным кодом (как это предлагается в других ответах) ). Существует новый пакет под названием cinspect , целью которого является просмотр источника для builtins .

Как я могу получить исходный код функции Python?

Предположим, у меня есть функция Python, как определено ниже:

Я могу получить имя функции, используя foo.func_name . Как я могу программно получить его исходный код, как я напечатал выше?

Если функция из исходного файла, доступного в файловой системе, то inspect.getsource(foo) может помочь:

Если foo определяется как:

Но я считаю, что если функция скомпилирована из строки, потока или импортирована из скомпилированного файла, то вы не сможете получить ее исходный код.

Модуль inspect имеет методы для извлечения исходного кода из объектов Python. По-видимому, это работает только в том случае, если источник находится в файле. Если бы у вас было это, я думаю, вам не нужно было бы получать источник от объекта.

dis Ваш друг, если исходный код недоступен:

Если вы используете IPython, то вам нужно набрать «foo ??»

Хотя я в целом согласен, что inspect это хороший ответ, я не согласен с тем, что вы не можете получить исходный код объектов, определенных в интерпретаторе. Если вы используете dill.source.getsource из dill , вы можете получить источник функций и лямбд, даже если они определены в интерактивном режиме. Он также может получить код для связанных или несвязанных методов и функций класса, определенных в карри . однако вы не сможете скомпилировать этот код без кода вмещающего объекта.

Чтобы расширить ответ Руны:

РЕДАКТИРОВАТЬ: Как указывает @ 0sh, этот пример работает, ipython но не простой python . Однако при импорте кода из исходных файлов все должно быть хорошо.

Вы можете использовать inspect модуль, чтобы получить полный исходный код для этого. Вы должны использовать getsource() метод для этого из inspect модуля. Например:

Вы можете проверить это больше вариантов по ссылке ниже. получить ваш код Python

Поскольку этот пост помечен как дубликат этого другого поста , я отвечу здесь за случай «лямбда», хотя ОП не касается лямбд.

Таким образом, для лямбда-функций, которые не определены в своих собственных строках: в дополнение к ответу marko.ristin вы можете использовать мини-лямбду или SymPy, как предложено в этом ответе .

  • mini-lambda легче и поддерживает любые операции, но работает только для одной переменной
  • SymPy тяжелее, но гораздо больше оснащено математическими / вычислительными операциями. В частности, это может упростить ваши выражения. Он также поддерживает несколько переменных в одном выражении.

Вот как вы можете сделать это, используя mini-lambda :

Это правильно дает

Смотрите mini-lambda документацию для деталей. Я, кстати, автор;)

Пожалуйста, обратите внимание, что принятые ответы работают, только если лямбда дана в отдельной строке. Если вы передадите его в качестве аргумента функции и захотите получить лямбда-код в виде объекта, проблема будет немного хитрой, поскольку inspect даст вам всю строку.

Например, рассмотрим файл test.py :

Выполнение этого дает вам (помните абзац!):

Чтобы получить исходный код лямбда-выражения, лучше всего, на мой взгляд, повторно проанализировать весь исходный файл (используя f.__code__.co_filename ) и сопоставить лямбда-узел AST по номеру строки и ее контексту.

Мы должны были сделать именно это в нашей библиотеке конструирования по контракту icontract, поскольку нам пришлось анализировать лямбда-функции, которые мы передаем в качестве аргументов декораторам. Здесь слишком много кода для вставки, так что взгляните на реализацию этой функции .

Если вы строго определяете функцию самостоятельно, и это относительно короткое определение, решение без зависимостей будет состоять в том, чтобы определить функцию в строке и присвоить eval () выражения вашей функции.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *