Когда функция в стандартном библиотечном модуле называется встроенной функцией?
Меня смущает термин "встроенная" функция. Я думал, что это означает только те функции, которые встроены в интерпретатор и задокументированы в - 2. Встроенные функции
Но оказывается, что функции, определенные в стандартных библиотечных модулях, также являются встроенными функциями (в некоторых случаях). Например -
>>> import os
>>> os.chdir
<built-in function chdir>
>>> import warnings
>>> warnings.warn
<built-in function warn>
>>> import json
>>> json.dumps
<function dumps at 0x7f3643a240d0> # not built-in
>>> dir
<built-in function dir>
>>>
Итак, когда функция в стандартном библиотечном модуле называется встроенной функцией, а когда нет?
Ответы
Ответ 1
Здесь есть два значения "встроенный", хотя оба они означают "часть интерпретатора". Ссылка на библиотеку использует его, чтобы указать, что функция доступна без import
(это "не часть модуля", хотя см. builtins
). Сам интерпретатор использует это, чтобы указать, что функция реализована изначально, а не в Python (в CPython она по крайней мере номинально реализована на C).
На стороне С есть еще одно значение: модуль расширения (т.е. Один написан на С) встроен, если бинарный файл Python включает его, а не загружает его, если и когда это необходимо.
Ответ 2
В книге "Свободный питон" Лучиано Рамальо, "Первое издание" третьего выпуска 2016-03-18, опубликованном О'Рейли, он читается на стр. 742:
Термин [т.е. "встроенная функция"] часто ссылается только на функции, которые не нужно импортировать... Но встроенные модули, такие как sys, math, re и т.д., Также содержат встроенные функции.
В целом этот термин, по-видимому, используется непоследовательно. Но для всех практических целей это не должно иметь никакого значения ".
Ответ 3
Встроенная функция, согласно Справочному руководству:
Встроенные функции
Встроенный объект функции является оберткой вокруг функции C. Примерами встроенных функций являются len()
и math.sin()
(math
- стандартный встроенный модуль). Число и тип аргументов определяются функцией C. Специальные атрибуты только для чтения: __doc__
- строка документации по функциям или None
если она недоступна; __name__
- имя функции; __self__
установлено значение None (но см. следующий пункт); __module__
- это имя модуля, в котором функция была определена в или Нет, если она недоступна.
Это относится к CPython, другие реализации, такие как Jython, будут использовать Java вместо C для реализации своих встроенных модулей.
Раздел " Встроенные функции стандартной библиотеки" говорит о вещах, которые всегда доступны. Это вместе со встроенными константами и встроенными типами формирует встроенное пространство имен идентификаторов, к которым вы всегда можете получить доступ.
Не все в этом встроенном пространстве имен является встроенной функцией или встроенным типом. Известными случаями являются те, которые используются в интерактивном режиме, например, help
и quit/exit
.
Ответ 4
Ну, из этого определения функция встроена, когда она говорит, что она встроена;)
Более серьезно: Python - это язык (назовем его "юридической" частью), CPython - это одна (а не единственная) реализация языка Python (назовем ее "технической" частью).
Из юридического POV в определении языка говорится, что реализация должна сделать некоторые функции (и классы и объекты) доступными без какого-либо импорта (IOW там "встроен" в сам язык). Это то, что документация Python определяет как "встроенный".
Теперь из технического POV это не мешает реализации из-за того, что некоторые другие функции/объекты/классы "технически" встроены (в том смысле, что они являются технически частью среды выполнения), но были показаны как часть одного из модулей или пакета stdlib.