Доступ к "областям модуля" vars

В настоящее время я изучаю 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", когда это необходимо. Плюс, импорт модуля в себя звучит довольно странно.

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

Ответы

Ответ 1

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

my_globals = {'var': None}

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

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