La idea detrás de esta omisión es que las variables estáticas solo son útiles en dos situaciones: cuando realmente deberías estar usando una clase y cuando realmente deberías estar usando un generador.
Si desea adjuntar información de estado a una función, lo que necesita es una clase. Una clase trivialmente simple, tal vez, pero una clase, sin embargo:
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()
Si desea el comportamiento de su función para cambiar cada vez que se llama, lo que necesita es un generador:
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()
Por supuesto, estático las variables son útiles para secuencias de comandos rápidas y sucias en las que no se desea lidiar con la molestia de grandes estructuras para pequeñas tareas. Pero allí, que realmente no necesita nada más que global
- puede parecer un pero kludgy, pero eso está bien para las pequeñas, de una sola vez guiones:
def foo():
global bar
do_stuff(bar)
foo()
foo()
Lo que estaba mal con las respuestas a http://stackoverflow.com/questions/460586/simulating-a-local-static-variable-in -¿pitón? ¿Por qué volver a hacer la pregunta? –
explícitamente no pregunté cómo simularlo, pero cuál es el motivo de esta decisión. –