What is the Python equivalent of static variables inside a function?
What is the Python equivalent of static variables inside a function?
A bit reversed, but this should work:
def foo():
foo.counter += 1
print Counter is %d % foo.counter
foo.counter = 0
If you want the counter initialization code at the top instead of the bottom, you can create a decorator:
def static_vars(**kwargs):
def decorate(func):
for k in kwargs:
setattr(func, k, kwargs[k])
return func
return decorate
Then use the code like this:
@static_vars(counter=0)
def foo():
foo.counter += 1
print Counter is %d % foo.counter
Itll still require you to use the foo.
prefix, unfortunately.
(Credit: @ony)
You can add attributes to a function, and use it as a static variable.
def myfunc():
myfunc.counter += 1
print myfunc.counter
# attribute must be initialized
myfunc.counter = 0
Alternatively, if you dont want to setup the variable outside the function, you can use hasattr()
to avoid an AttributeError
exception:
def myfunc():
if not hasattr(myfunc, counter):
myfunc.counter = 0 # it doesnt exist yet, so initialize it
myfunc.counter += 1
Anyway static variables are rather rare, and you should find a better place for this variable, most likely inside a class.
What is the Python equivalent of static variables inside a function?
One could also consider:
def foo():
try:
foo.counter += 1
except AttributeError:
foo.counter = 1
Reasoning:
- much pythonic (ask for forgiveness not permission)
- use exception (thrown only once) instead of
if
branch (think StopIteration exception)