Альтернатива глобальному в 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.