доступ к "области видимости модуля" - PullRequest
19 голосов
/ 27 июля 2011

В настоящее время я изучаю Python, и мне нужно работать над проектом Python 2.7.

Доступ к переменным "области видимости модуля" в функциях самого модуля меня немного смущает, и мне не удалось найти удовлетворительный способ.

Мои попытки пока:

Путь 1:

my_module.py

my_global_var = None

def my_func():
    global my_global_var
    my_global_var = 'something_else'

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

Путь 2:

my_module.py

import my_module

my_global_var = None

def my_func():
    my_module.my_global_var = 'something_else'

Здесь имя «my_module» нельзя изменить так же легко, как «путь 1», когда это необходимо. Плюс, импорт модуля в себя звучит довольно странно.

Что бы вы порекомендовали? Или вы бы предложили что-то еще? Спасибо.

Ответы [ 4 ]

25 голосов
/ 27 июля 2011

Вы, вероятно, хотите прочитать о пространствах имен Python . Способ 1 верен, но, как правило, не нужен, никогда не используйте 2. Более простой подход - просто использовать dict (или класс, или какой-либо другой объект):

my_globals = {'var': None}

def my_func():
    my_globals['var'] = 'something else'

Присвоения всегда входят в самую внутреннюю область, а самая внутренняя область всегда ищется первой, поэтому необходимо глобальное ключевое слово. В этом случае вы не присваиваете имя, так что это не нужно.

4 голосов
/ 27 июля 2011

Путь 1 - правильный путь, когда вы абсолютно должны перепривязать глобальную переменную. Однако вы должны спросить себя, почему вы модифицируете глобал и есть ли что-то лучшее, что вы можете сделать (например, инкапсулировать поведение в классе).

Следует избегать импорта модуля в себя, так как он подвержен ошибкам. Если модуль также является сценарием, вам иногда придется импортировать __main__ или если модуль является частью пакета, возможно, вам следует импортировать foo.my_module. Короче, не делай этого.

3 голосов
/ 27 июля 2011

Импорт модуля внутри самого себя может привести к нежелательным побочным эффектам (например, к оценке операторов более одного раза). Я бы предложил использовать «Путь 1» и такой инструмент, как pylint, для проверки вашего кода и применения общих практик.

PyLint можно найти по адресу: http://www.logilab.org/project/pylint

1 голос
/ 27 июля 2011

Избегайте настройки глобалов вообще.Вы можете легко создавать новые пространства имен с классами, поэтому используйте переменные класса, если необходимо.

Для чего-либо серьезного вам все равно нужен правильный дизайн с классами.

...