Альтернатива глобальному в Python
В настоящее время у меня есть код:
cache = 1
def foo():
global cache
# many
# lines
# of code
cache = 2
Однако в будущем это может привести к труднодоступным ошибкам, поскольку читатель может не заметить, что global cache
появляется где-то выше cache = 2
. В качестве альтернативы, вкладчик может ошибочно добавить def bar(): cache = 2
и забыть добавить global cache
.
Как я могу избежать этой ловушки?
Ответы
Ответ 1
class Cache:
myvar = 1
def foo():
Cache.myvar = 2
Таким образом, Cache.myvar
является практически "глобальным". Можно читать/писать ему из любого места.
Я предпочитаю это по сравнению с альтернативой словаря, поскольку он позволяет автоматически заполнять имена переменных.
Ответ 2
cache = 1
def foo():
return 2
cache = foo()
или
d = {'cache': 1}
def foo(x):
x['cache'] = 2
foo(d)
Ответ 3
"читатель может непреднамеренно подумать, что глобальная переменная обновлена" - это не большая ошибка. Вы должны ожидать, что люди, читающие ваш код, знают, как работает Python. Если вы хотите сделать это более ясным, используйте комментарий. Для чего они предназначены.
Ответ 4
Использование глобальной переменной не является хорошей практикой программирования. Передайте переменную в качестве аргумента: make функция возвращает что-то и использует ее в другой функции. Функция может быть назначением переменной, как работает Python.