Ищете исходный код для встроенных функций Python?

152

Есть ли способ увидеть, как встроенные функции работают в Python? Я имею в виду не только то, как их использовать, но и то, как они были созданы, какой код стоит за сортировкой или перечислением и т. Д.?

user1073865
источник

Ответы:

141

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

Чтобы узнать, в каком файле реализован конкретный модуль или функция, вы обычно можете распечатать __file__атрибут. В качестве альтернативы вы можете использовать inspectмодуль, см. Раздел « Получение исходного кода» в документации inspect.

Для встроенных классов и методов это не так просто , так inspect.getfileи inspect.getsourceбудет возвращать ошибку типа о том , что объект встроен. Тем не менее, многие из встроенных типов можно найти в Objectsподкаталоге исходной магистрали Python . Например, см. Здесь реализацию класса enumerate или здесь реализацию listтипа.

Крис
источник
Можете привести пример enumerate?
Бенджамин
после OP, как насчет исходного кода для "отсортированного"? конечно, inspect.getsourcefile (отсортированный) не работает.
Quetzalcoatl
3
@Quetzalcoatl, исходный код для которого sorted()находится в /Python/bltinmodule.c, хотя он просто вызывает, list.sort()поэтому реальный источник находится в /Objects/listobject.c
Борис
было бы полезно, если бы вы привели пример того, как использовать __file__
stackoverflowpro
1
В качестве примечания для себя и для будущих гуглеров: open()функции определены Modules/_io/_iomodule.cв Python 3 (а не среди других встроенных функций ).
peter.slizik
36

Вот ответ поваренной книги, дополняющий ответ @Chris , CPython переместился на GitHub, и репозиторий Mercurial больше не будет обновляться:

  1. При необходимости установите Git.
  2. git clone https://github.com/python/cpython.git

  3. Код будет оформлен в подкаталог с именем cpython->cd cpython

  4. Допустим, мы ищем определение print()...
  5. egrep --color=always -R 'print' | less -R
  6. Ага! См Python/bltinmodule.c->builtin_print()

Наслаждаться.

Kevinarpe
источник
27

введите описание изображения здесь

Мне пришлось немного покопаться, чтобы найти источник следующего, Built-in Functionsпоскольку поиск дал бы тысячи результатов. (Удачи в поисках любого из них, чтобы найти его источник)

В любом случае, все эти функции определены в bltinmodule.cразделе Функции, начинающиеся сbuiltin_{functionname}

Встроенный источник: https://github.com/python/cpython/blob/master/Python/bltinmodule.c

Для встроенных типов: https://github.com/python/cpython/tree/master/Objects

user1767754
источник
1
Список - это объект / тип, а не встроенная функция. Вы можете найти подробности реализации этого в listobject.c github.com/python/cpython/tree/master/Objects
user1767754
20

IPython оболочка делает это легко: function?даст вам документацию. function??показывает также код. НО это работает только для чистых функций Python.

Тогда вы всегда можете скачать исходный код для (c) Python.

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

tback
источник
1
PyPy использует RPython для большинства встроенных вещей, которые могут быть почти такими же низкоуровневыми, как C, и почти такими же высокими, как Python. Обычно это посередине. В любом случае он статически типизирован, поэтому на самом деле это не Python.
2
См. Ранний проект для просмотра исходного кода встроенной функции: github.com/punchagan/cinspect
Thomas
9

2 метода,

  1. Вы можете проверить использование сниппета, используя help()
  2. вы можете проверить скрытый код для этих модулей, используя inspect

1) осмотреть:

используйте модуль inpsect для изучения кода, который вы хотите ... ПРИМЕЧАНИЕ: вы можете исследовать код только для модулей (ака) пакетов, которые вы импортировали

например:

  >>> import randint  
  >>> from inspect import getsource
  >>> getsource(randint) # here i am going to explore code for package called `randint`

2) help ():

вы можете просто использовать help()команду, чтобы получить справку по встроенным функциям, а также по их коду.

например: если вы хотите увидеть код для str (), просто введите - help(str)

он вернется вот так,

>>> help(str)
Help on class str in module __builtin__:

class str(basestring)
 |  str(object='') -> string
 |
 |  Return a nice string representation of the object.
 |  If the argument is a string, the return value is the same object.
 |
 |  Method resolution order:
 |      str
 |      basestring
 |      object
 |
 |  Methods defined here:
 |
 |  __add__(...)
 |      x.__add__(y) <==> x+y
 |
 |  __contains__(...)
 |      x.__contains__(y) <==> y in x
 |
 |  __eq__(...)
 |      x.__eq__(y) <==> x==y
 |
 |  __format__(...)
 |      S.__format__(format_spec) -> string
 |
 |      Return a formatted version of S as described by format_spec.
 |
 |  __ge__(...)
 |      x.__ge__(y) <==> x>=y
 |
 |  __getattribute__(...)
-- More  --
Мохидин бин Мохаммед
источник
6
ОП специально хочет посмотреть код, справка дает только документацию.
0xc0de
6

Довольно неизвестный ресурс - это Руководство разработчика Python .

В (несколько) недавнем выпуске GH была добавлена ​​новая глава для ответа на вопрос, который вы задаете: Макет исходного кода CPython . Если что-то изменится, этот ресурс также будет обновлен.

Димитрис Фасаракис Хиллиард
источник
2

Как упомянул @Jim, здесь описана файловая организация . Воспроизведено для простоты обнаружения:

Для модулей Python типичная компоновка:

Lib/<module>.py
Modules/_<module>.c (if there’s also a C accelerator module)
Lib/test/test_<module>.py
Doc/library/<module>.rst

Для модулей, предназначенных только для расширения, типовая компоновка:

Modules/<module>module.c
Lib/test/test_<module>.py
Doc/library/<module>.rst

Для встроенных типов типичный макет:

Objects/<builtin>object.c
Lib/test/test_<builtin>.py
Doc/library/stdtypes.rst

Для встроенных функций типичный макет:

Python/bltinmodule.c
Lib/test/test_builtin.py
Doc/library/functions.rst

Некоторые исключения:

builtin type int is at Objects/longobject.c
builtin type str is at Objects/unicodeobject.c
builtin module sys is at Python/sysmodule.c
builtin module marshal is at Python/marshal.c
Windows-only module winreg is at PC/winreg.c
Матин Улхак
источник