Чи є спосіб побачити, як вбудовані функції працюють у python? Я не маю на увазі лише те, як ними користуватися, а також як вони були побудовані, що за кодом відсортований чи перелічений тощо ...?
Чи є спосіб побачити, як вбудовані функції працюють у python? Я не маю на увазі лише те, як ними користуватися, а також як вони були побудовані, що за кодом відсортований чи перелічений тощо ...?
Відповіді:
Оскільки Python є відкритим кодом, ви можете прочитати вихідний код .
Щоб дізнатись, у якому файлі реалізований конкретний модуль або функція, зазвичай можна надрукувати __file__
атрибут. Крім того, ви можете використовувати inspect
модуль, дивіться розділ Отримання вихідного коду в документаціїinspect
.
Для вбудованих класів і методів це не так просто , так inspect.getfile
і inspect.getsource
буде повертати помилку типу про те , що об'єкт вбудований. Однак багато вбудованих типів можна знайти в Objects
підкаталозі магістралі джерела Python . Наприклад, дивіться тут про реалізацію переліченого класу або тут для реалізації list
типу.
sorted()
знаходиться в /Python/bltinmodule.c, хоча він просто викликає, list.sort()
тому справжнє джерело знаходиться в /Objects/listobject.c
Ось відповідь кулінарної книги на додаток до відповіді @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??
показує також код. Але це працює лише для функцій чистого пітона.
Тоді ви завжди можете завантажити вихідний код для (c) Python.
Якщо вас цікавлять пітонічні реалізації основних функціональних можливостей, ознайомтеся з джерелом PyPy .
2 методи,
help()
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 --
Досить невідомий ресурс - це Посібник для розробників 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
?