Есть ли способ увидеть, как встроенные функции работают в Python? Я имею в виду не только то, как их использовать, но и то, как они были созданы, какой код стоит за сортировкой или перечислением и т. Д.?
Есть ли способ увидеть, как встроенные функции работают в Python? Я имею в виду не только то, как их использовать, но и то, как они были созданы, какой код стоит за сортировкой или перечислением и т. Д.?
Ответы:
Поскольку Python является открытым исходным кодом, вы можете прочитать исходный код .
Чтобы узнать, в каком файле реализован конкретный модуль или функция, вы обычно можете распечатать __file__
атрибут. В качестве альтернативы вы можете использовать inspect
модуль, см. Раздел « Получение исходного кода» в документации inspect
.
Для встроенных классов и методов это не так просто , так inspect.getfile
и inspect.getsource
будет возвращать ошибку типа о том , что объект встроен. Тем не менее, многие из встроенных типов можно найти в Objects
подкаталоге исходной магистрали Python . Например, см. Здесь реализацию класса enumerate или здесь реализацию list
типа.
sorted()
находится в /Python/bltinmodule.c, хотя он просто вызывает, list.sort()
поэтому реальный источник находится в /Objects/listobject.c
__file__
open()
функции определены Modules/_io/_iomodule.c
в Python 3 (а не среди других встроенных функций ).
Вот ответ поваренной книги, дополняющий ответ @Chris , CPython переместился на GitHub, и репозиторий Mercurial больше не будет обновляться:
git clone https://github.com/python/cpython.git
Код будет оформлен в подкаталог с именем cpython
->cd cpython
print()
...egrep --color=always -R 'print' | less -R
Python/bltinmodule.c
->builtin_print()
Наслаждаться.
Мне пришлось немного покопаться, чтобы найти источник следующего, 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
listobject.c
github.com/python/cpython/tree/master/Objects
IPython оболочка делает это легко: function?
даст вам документацию. function??
показывает также код. НО это работает только для чистых функций Python.
Тогда вы всегда можете скачать исходный код для (c) Python.
Если вас интересуют питонические реализации основных функций, взгляните на исходный код PyPy .
2 метода,
help()
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 --
Довольно неизвестный ресурс - это Руководство разработчика Python .
В (несколько) недавнем выпуске GH была добавлена новая глава для ответа на вопрос, который вы задаете: Макет исходного кода CPython . Если что-то изменится, этот ресурс также будет обновлен.
Как упомянул @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
enumerate
?