Пошук вихідного коду для вбудованих функцій Python?


142

Чи є спосіб побачити, як вбудовані функції працюють у python? Я не маю на увазі лише те, як ними користуватися, а також як вони були побудовані, що за кодом відсортований чи перелічений тощо ...?

Відповіді:


135

Оскільки Python є відкритим кодом, ви можете прочитати вихідний код .

Щоб дізнатись, у якому файлі реалізований конкретний модуль або функція, зазвичай можна надрукувати __file__атрибут. Крім того, ви можете використовувати inspectмодуль, дивіться розділ Отримання вихідного коду в документаціїinspect .

Для вбудованих класів і методів це не так просто , так inspect.getfileі inspect.getsourceбуде повертати помилку типу про те , що об'єкт вбудований. Однак багато вбудованих типів можна знайти в Objectsпідкаталозі магістралі джерела Python . Наприклад, дивіться тут про реалізацію переліченого класу або тут для реалізації listтипу.


Чи можете ви навести приклад enumerate?
Бенджамін

Слідом за ОП, як щодо вихідного коду для "відсортованого"? Звичайно, inspect.getsourcefile (сортування) не працює.
Quetzalcoatl

2
@Quetzalcoatl вихідний код sorted()знаходиться в /Python/bltinmodule.c, хоча він просто викликає, list.sort()тому справжнє джерело знаходиться в /Objects/listobject.c
Борис,

35

Ось відповідь кулінарної книги на додаток до відповіді @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()

Насолоджуйтесь.


22

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

Мені довелося трохи копати, щоб знайти джерело наступного 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


1
Список - це об'єкт / тип, а не вбудована функція. Ви можете знайти деталі реалізації цього в listobject.c github.com/python/cpython/tree/master/Objects
користувач1767754

19

IPython оболонка робить це легко: function?дасть вам документацію.function??показує також код. Але це працює лише для функцій чистого пітона.

Тоді ви завжди можете завантажити вихідний код для (c) Python.

Якщо вас цікавлять пітонічні реалізації основних функціональних можливостей, ознайомтеся з джерелом PyPy .


1
PyPy використовує RPython для більшості вбудованих матеріалів, які можуть бути майже настільки ж низькими, як C, і майже настільки ж високі, як і Python. Зазвичай це між ними. В будь-якому випадку він статично набраний, тому насправді це не Python.

2
Дивіться ранній проект для перегляду вихідного коду вбудованої функції: github.com/punchagan/cinspect
Thomas

8

2 методи,

  1. Ви можете перевірити використання щодо фрагмента за допомогою help()
  2. ви можете перевірити прихований код для цих модулів, використовуючи inspect

1) перевірити:

використовуйте інсект- модуль для дослідження потрібного коду ... ПРИМІТКА: Ви можете досліджувати код лише для імпортних пакунків (ака)

наприклад:

  >>> 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  --

4
ОП спеціально хоче переглянути код, допомога дає лише документацію.
0xc0de


1

Як згадував @Jim, тут описана організація файлів . Відтворено для зручності відкриття:

Типовий макет для модулів Python:

Lib/<module>.py
Modules/_<module>.c (if theres 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.