Смущает область видимости пакета python - PullRequest
2 голосов
/ 12 августа 2011

Я новичок в Python, и меня смущает определенное поведение.

У меня есть каталог с именем d. В этом каталоге у меня есть два файла:

__init__.py

from d import *

и

d.py:

var = None

def printVar():
  global var
  print "from d: var=%s" % `var`

Из каталога выше d я получаю это взаимодействие внутри python:

>>> import d
>>> d.var = 5
>>> d.printVar()
from d: var=None

Почему var не изменилось с точки зрения d.py?

Моя настоящая цель - достичь следующего:

  • Keep __init__.py small
  • Возможность изменения d.py -глобальной переменной

Если это имеет значение, у меня есть несколько файлов в каталоге пакетов, и было бы неоптимальным объединить их в один файл.

Каков приемлемый способ сделать это?

Ответы [ 3 ]

2 голосов
/ 12 августа 2011

Когда вы говорите:

import d

вы импортируете пакет, а не модуль.

Просто импортируйте модуль d внутри пакета:

>>> from d import d
>>> d.var = 5
>>> d.printVar()
from d: var=5
0 голосов
/ 12 августа 2011
from X import *

Копирует все имена из X в локальный модуль. В результате изменение локального модуля не приведет к изменению оригинала.

Что касается того, что вы на самом деле хотите сделать, вы можете использовать некоторые хакерские программы для Python и заменить объект модуля своим собственным, который перегружает операцию назначения атрибута. Но не делай этого. Это потребует много кода и просто заставит вас выглядеть странно.

Я предлагаю иметь функцию, которую может вызвать клиентский код foo.

0 голосов
/ 12 августа 2011

Я думаю, что фактическое имя глобального var должно быть d.d.var (потому что оно находится в модуле d в пакете d)

Так что вы могли бы

1) Просто укажите его как d.d.var, когда вы установите

2) Сделать сеттер в d.py

К сожалению, это, вероятно, не сработает:

a) Скопируйте его в d.var и попробуйте установить его там (что есть в вашем вопросе) - это другая переменная

а) импортировать обратно как from __init__ import var (рекурсивный импорт)

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