Как посмотреть на реализацию встроенных функций python в pycharm? - PullRequest
0 голосов
/ 29 августа 2018

Когда я пытаюсь просмотреть встроенную функцию all () в PyCharm, я просто вижу «pass» в теле функции. Как просмотреть фактическую реализацию, чтобы я мог знать, что именно делает встроенная функция?

def all(*args, **kwargs): # real signature unknown
    """
    Return True if bool(x) is True for all values x in the iterable.

    If the iterable is empty, return True.
    """
    pass

1 Ответ

0 голосов
/ 29 августа 2018

Если вы используете обычный интерпретатор CPython, all - это объект встроенной функции, который просто имеет указатель на скомпилированную функцию, статически связанную с интерпретатором (или libpython). Показывать вам машинный код x86_64 по этому адресу, вероятно, не очень полезно для подавляющего большинства людей.


Попробуйте запустить свой код в PyPy вместо CPython. Многие вещи, которые являются встроенными в CPython, являются простым старым кодом Python в PyPy. 1 Конечно, это не всегда вариант (например, PyPy пока не поддерживает функции 3.7, есть несколько сторонних разработчиков). модули расширения, которые все еще слишком медленны в использовании, их сложнее собрать, если вы работаете на необычной платформе…), поэтому давайте вернемся к CPython.


Фактический источник C для этой функции не так уж сложно найти в Интернете. Это в bltinmodule.c. Но, в отличие от исходного кода модулей Python в стандартной библиотеке, у вас, вероятно, нет этих файлов. Даже если у вас do они есть, единственный способ подключить двоичный файл к источнику - отладка выходных данных, генерируемых при компиляции CPython из этого источника, чего вы, вероятно, не делали. Но если вы думаете, что это звучит как отличная идея - это так. Соберите CPython самостоятельно (вам может потребоваться сборка Py_DEBUG), а затем вы можете просто запустить его в отладчике / IDE исходного кода C, и он сможет обрабатывать все неуклюжие биты.

Но если это звучит скорее страшно, чем полезно, даже если вы можете прочитать базовый код C и хотели бы его найти ...


Как я узнал, где найти этот код на GitHub? Ну, я знаю, где находится репо; Я знаю основы организации исходного кода в Python, Objects, Modules и т.д .; Я знаю, как имена модулей обычно отображаются на имена исходных файлов C; Я знаю, что buildins особенные в нескольких отношениях ...

Это все довольно простые вещи. Не могли бы вы просто запрограммировать все эти знания в сценарий, из которого вы могли бы затем создать плагин PyCharm?

Вы можете сделать первые 50% или около того в быстром вечернем взломе, и такие вещи засоряют берега GitHub. Но для того, чтобы сделать это правильно, нужно обработать кучу особых случаев, проанализировать некрасивый код C и т. Д. И для любого, кто способен написать такую ​​вещь, проще просто lldb Python, чем написать.


1. Кроме того, даже вещи, которые являются встроенными, написаны на смеси Python и подмножества Python, называемого RPython, который вам может показаться более простым для понимания, чем C, но, опять же, зачастую еще труднее найти этот источник, и несколько уровней, которые все выглядят как Python, могут быть трудно поддерживать прямо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...