Пространство имен Python между встроенными и глобальными? - PullRequest
2 голосов
/ 10 июня 2010

Насколько я понимаю, python имеет следующие внешние пространства имен:

Построение - это пространство имен является глобальным для всего интерпретатора и для всех сценариев, работающих в экземпляре интерпретатора.

Globals - это пространство имен является глобальным для модуля, то есть для одного файла.

Я ищу пространство имен между этими двумя, где я могу поделиться несколькими переменными, объявленными в основном скрипте, с вызываемыми им модулями.

Например, script.py:

import Log from Log
import foo from foo

log = Log()
foo()

foo.py:

def foo():
    log.Log('test')  # I want this to refer to the callers log object

Я хочу иметь возможность вызывать script.py несколько раз и в каждом случае предоставлять объект журнала уровня модуля методу foo.

Есть идеи, если это возможно?

Не будет слишком больно передавать объект журнала, но я работаю с большим фрагментом кода, который был перенесен из Javascript. Я также понимаю, что это накладывает ограничения на вызывающую функцию foo для предоставления объекта журнала.

Спасибо, Пол

Ответы [ 3 ]

4 голосов
/ 10 июня 2010

Нет пространства имен «между» встроенными и глобальными переменными - но вы можете легко создать свои собственные пространства имен и вставить их с именем в sys.modules, так что любой другой модуль может «импортировать» их (в идеале не с использованием синтаксиса from ... import, который несет массу проблем, и определенно не использует изобретенный вами синтаксис import ... from, который просто дает синтаксическую ошибку).Например, в script.py:

import sys
import types
sys.modules['yay'] = types.ModuleType('yay')

import Log
import foo

yay.log = Log.Log()
foo.foo()

и в foo.py

import yay

def foo():
  yay.log.Log('test')

Не бойтесь квалифицированных имен - это доброта !Или, как сказано в последней строке дзен Python (AKA import this):

Namespaces are one honking great idea -- let's do more of those!

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

0 голосов
/ 18 сентября 2010

На самом деле, я понял, что я искал.

Этот хак на самом деле используется PLY, и вот где он наткнулся.

Код библиотеки может вызвать исключение времени выполнения, которое затем дает доступ к стеку вызывающих.

0 голосов
/ 10 июня 2010

Нет такой сферы.Вам нужно будет либо добавить в область встроенных функций, либо передать соответствующий объект.

...