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.counterfoo.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
It'll 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 initializedmyfunc.counter = 0
Alternatively, if you don't 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 doesn't 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.
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)