Могут ли стандартные модули Python для записи в Python использоваться без импорта?

1

У меня были некоторые трудности с модулями в Python. Я понял, что встроенные модули, написанные на C, похожи на часть интерпретатора Python, поэтому они доступны для программиста как принадлежащие встроенному пространству имен и, следовательно, не требуют импорта, Это ограничивается только этими модулями, а это означает, что все другие не встроенные модули стандартной библиотеки, написанные на Python, необходимо импортировать для использования?

Спасибо.

Теги:

1 ответ

5
Лучший ответ

TL;DR: перед использованием вы должны импортировать каждый модуль, за исключением builtins.


В отношении Python существует два разных типа "встроенных":

  1. Встроенные объекты, которые компилируются, такие как int или os.chmod.
  2. builtins модуль, содержащий базовый набор объектов, таких как int и help.

Вещи могут быть частью 1, не будучи частью 2, и наоборот. Например, help - это чисто Python-функция, а os.chmod является частью модуля os. Тем не менее, большая часть содержимого в 2 также является частью 1 по практическим соображениям: builtins средства используются часто, а скомпилированные объекты обычно имеют лучшую производительность.


Встроенные объекты могут представлять любой тип модуля, функции или объекта. Спецификация языка на самом деле не определяет, какие объекты являются встроенными, а какие встроенными. Детали варьируются в зависимости от реализации: CPython использует скомпилированные структуры и функции C, тогда как PyPy использует, например, скомпилированные объекты RPython.

Как правило, "все, что не определено кодом Python" является встроенным. Однако это не совсем так: встроенный объект может обращаться к интерпретатору для создания обычных объектов Python. Общим для всех встроенных компонентов является то, что они выглядят как обычные объекты Python, но их внутренние элементы могут следовать произвольным правилам.

Обратите внимание, что встроенная функция не обязательно встроена в интерпретатор. CPython предоставляет C API, а PyPy эмулирует его через cpyext, что позволяет интерпретатору загружать и использовать общие библиотеки. Многие сторонние библиотеки используют скомпилированные объекты и функции Cython для предоставления пользовательских встроенных функций. Однако можно использовать любой язык, который может создавать общие библиотеки, совместимые с C API.


builtins модуль является фактическим модулем с именем builtins. Все имена этого модуля всегда доступны во всех других модулях: поиск по builtins производится всякий раз, когда имя не найдено в текущей области, содержащей ее области или текущем модуле.

Это похоже, но не так, как если бы в каждом модуле был from builtins import *: если builtins изменяются, имена встроенных отражают это.

>>> int(5)
5
>>> import builtins
>>> builtins.int = float
>>> int(5)
5.0

Например, _ в интерактивном сеансе Python является частью builtins функций. Он изменяется при каждом запуске команды.

Отказ от ответственности: это только для демонстрации. Это действительно очень плохая идея модифицировать builtins самостоятельно.


В то время как только имена из builtins доступны без импорта, Python обычно импортирует несколько модулей при запуске.

$ python3 -c 'import sys;print(sys.modules.keys())'
dict_keys(['sys', 'builtins', '_frozen_importlib', '_imp', '_thread', '_warnings', '_weakref', 'zipimport', '_frozen_importlib_external', '_io', 'marshal', 'posix', 'encodings', 'codecs', '_codecs', 'encodings.aliases', 'encodings.utf_8', '_signal', '__main__', 'encodings.latin_1', 'io', 'abc', '_abc', 'site', 'os', 'stat', '_stat', 'posixpath', 'genericpath', 'os.path', '_collections_abc', '_sitebuiltins', '_bootlocale', '_locale', 'types', 'importlib', 'importlib._bootstrap', 'importlib._bootstrap_external', 'warnings', 'importlib.util', 'importlib.abc', 'importlib.machinery', 'contextlib', 'collections', 'operator', '_operator', 'keyword', 'heapq', '_heapq', 'itertools', 'reprlib', '_collections', 'functools', '_functools', 'mpl_toolkits', 'sphinxcontrib', 'sitecustomize', 're', 'enum', 'sre_compile', '_sre', 'sre_parse', 'sre_constants', 'copyreg'])

Некоторые из них являются частью высокоуровневых частей интерпретатора, например, sys и importlib. sitecustomize и usercustomize позволяют подготовить вашу среду - например, изменить внешний вид интерактивного интерпретатора, задать пути поиска в os.environment и т.п.

  • 0
    Thx .. Я действительно смущен всем этим: каждый модуль, написанный на C, считается встроенным или нет? Верно ли наоборот, то есть каждый встроенный написан на C?
  • 1
    Как правило, встроенным является «все, что не определено в Python». Каждый модуль, написанный на C, является встроенным, но не каждый модуль написан на C, и модуль C может определять обычные объекты Python. CPython принимает любой общий объект ( .so / .dll ), который соответствует его C API - будь то скомпилированный из кода C, C ++, Fortran, Rust или любого другого.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню