Python: в чем разница между builtin и builtins?
Я кодировал сегодня и кое-что заметил. Если я открою новый сеанс интерпретатора (IDLE) и проверю, что определено с помощью
4 ответов
прямо из документации python: http://docs.python.org/reference/executionmodel.html
по умолчанию, когда в
__main__
модуль__builtins__
это встроенный модуль__builtin__
(Примечание: нет 's'); когда в любом другом модуль__builtins__
- это псевдоним для словаря__builtin__
сам модуль.
__builtins__
можно установить в пользовательский словарь для создания слабая форма ограниченного исполнения.CPython деталь реализации: пользователи не должны касаться
__builtins__
; это строго деталь реализации. Пользователи для переопределения значений в пространстве имен builtins необходимоimport
the__builtin__
(нет 's') модуль и изменить его атрибуты соответственно. Пространство имен для модуля создается автоматически при первом импорте модуля.
обратите внимание, что в Python3 модуль __builtin__
переименовано в builtins
чтобы избежать некоторых из этих путаница.
вы должны использовать __builtin__
в ваших программах (в редких случаях, когда вам это нужно), потому что __builtins__
является деталью реализации CPython. Он может быть либо идентичен __builtin__
или __builtin__.__dict__
в зависимости от контекста. As документация говорит:
большинство модулей имеют имя
__builtins__
(обратите внимание на "s"), доступные как часть их глобалов. Значение__builtins__
обычно это либо этот модуль, либо значение этого модуля__dict__
атрибут. Поскольку это деталь реализации, она не может использоваться альтернативными реализациями Python.
В Python 3, __builtin__
переименовано в builtins
и __builtins__
остается прежним (поэтому вы должны использовать только builtins
в Python 3).
Гвидо хотел объединить __builtin__
и __builtins__
, Как видим здесь ("имеющего __builtins__
и __builtin__
оба явно плохая идея."), но, по-видимому, из этого ничего не вышло.
видимо использование __builtins__
для производительности - это дает прямой доступ к __builtin__.__dict__
при использовании в не-главном модуле, и поэтому извлекает один уровень косвенности.
__builtin__
модуль, содержащий встроенные функции и типы. Дело в том, что имя __builtins__
доступно, содержащее то же самое, что и деталь реализации. Другими словами, если вам нужно использовать один из них, не import __builtin__
и затем использовать __builtin__
. См.документация.
вы можете понять это как следующий код.
когда cpython запущен, cpython load __builtin__
модули в глобальное пространство имен
импорт __builtin__
as __builtins__