два противоречивых значения встроенных в python 3 (python 3.1, python 3k, python3000) - PullRequest
3 голосов
/ 01 февраля 2010

Я только что разместил ниже запрос к comp.lang.python, но я чувствую, что у такого рода вопроса также есть своего рода право прохода здесь, при переполнении стека, так что будьте повторены. суть: почему «встроенные» имеют две разные интерпретации в Python 3?

Я был бы очень рад принять любые комментарии о том, что это предложение, взятое из http://celabs.com/python-3.1/reference/executionmodel.html, подразумевается, или почему боги решили, что это путь. я предвидеть, что этот парень по имени Кей Schluehr будет иметь право голоса, или может быть, даже BDFL попытается произнести __builtins__ правильный путь к своим спутникам, последователям и собратьям ::

  The built-in namespace associated with the execution of
  a code block is actually found by looking up the name
  __builtins__ in its global namespace; this should be a
  dictionary or a module (in the latter case the module’s
  dictionary is used). By default, when in the __main__
  module, __builtins__ is the built-in module builtins;
  when in any other module, __builtins__ is an alias for
  the dictionary of the builtins module itself.
  __builtins__ can be set to a user-created dictionary to
  create a weak form of restricted execution.

Раньше было как минимум два разных термина, «Встроенный» (в единственном числе) и «встроенный» (во множественном числе), некоторые из который существовал как в модуле, так и в форме диктовки («просто догадываться»). сейчас есть только builtins, поэтому, к счастью, амбивалентность между единственное и множественное число исчезло - хорошее избавление.

но почему __builtins__ меняет свое значение в зависимости от того, это область действия «сценария» (т. е. модуля, имя которого было присутствует, при вызове python foobar.py) или это область действия вторичного модуля (импортируется или выполняется, напрямую или косвенно, по foobar.py)? я не могу понять аргументацию за этим и нахожу это очень запутанным.

обоснование: почему меня это волнует? - я хочу иметь возможность экспортировать имена в глобальное пространство имен, которое не было помечено как частное (подчеркивание префикс) в модуле Python, который я выполняю через exec( compile( get ( locator ), locator, 'exec' ), R ), где R должен идти хранить личные имена указанного модуля ». это это немного загадочно, но основное упражнение состоит в том, чтобы обойти систему импорта python и получить similr результаты ... это все о введении имен в глобальном и глобальные пространства имен модуля.

1 Ответ

1 голос
/ 01 февраля 2010

getattr(__builtins__, '__dict__', __builtins__) должен дать вам диктовку, которую вы хотите обновить до "экспорта имен в глобальное пространство имен", независимо от того, является ли __builtins__ диктом (тогда у него нет атрибута __dict__, поэтому getattr возвращает третий аргумент, который является самим dict __builtins__) или модулем (тогда он имеет имеет этот атрибут и getattr возвращает его). Это обходной путь. Что касается того, почему документация Python работает так, что требует такого запутанного обходного пути, я бы отнес это к неудачному случаю проблемы реализации, выходящей на видимый для пользователя (и действительно задокументированный) уровень (вздох). Жаль, что мы не думали о том, чтобы исправить это при переходе на Python 3, но уже слишком поздно вносить обратно несовместимые изменения: - (.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...