Идея этого упущения заключается в том, что статические переменные полезны только в двух ситуациях: когда вы действительно должны использовать класс и когда вам действительно следует использовать генератор.
Если вы хотите присоединить информацию о состоянии к функции, вам нужен класс. Тривиально простой класс, возможно, но класс, тем не менее:
def foo(bar):
static my_bar # doesn't work
if not my_bar:
my_bar = bar
do_stuff(my_bar)
foo(bar)
foo()
# -- becomes ->
class Foo(object):
def __init__(self, bar):
self.bar = bar
def __call__(self):
do_stuff(self.bar)
foo = Foo(bar)
foo()
foo()
Если вы хотите, чтобы поведение вашей функции менялось при каждом вызове, вам нужен генератор:
def foo(bar):
static my_bar # doesn't work
if not my_bar:
my_bar = bar
my_bar = my_bar * 3 % 5
return my_bar
foo(bar)
foo()
# -- becomes ->
def foogen(bar):
my_bar = bar
while True:
my_bar = my_bar * 3 % 5
yield my_bar
foo = foogen(bar)
foo.next()
foo.next()
Конечно, статические переменные полезны для быстрых и грязных скриптов, где вы не хотите иметь дело с большими структурами для небольших задач. Но в действительности вам не нужно ничего, кроме global
- это может показаться глупым, но это нормально для небольших одноразовых скриптов:
def foo():
global bar
do_stuff(bar)
foo()
foo()