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