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__