什么是函数内部的静态变量的Python等价物?

这个C / C ++代码的惯用Python等价物是什么?

void foo()
{
    static int counter = 0;
    counter++;
    printf("counter is %dn", counter);
}

具体而言,如何在功能级别实现静态成员,而不是类级别? 并且将函数放入类中是否会改变任何内容?


有点逆转,但这应该工作:

def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter
foo.counter = 0

如果你想在顶部而不是底部计数器初始化代码,你可以创建一个装饰器:

def static_var(varname, value):
    def decorate(func):
        setattr(func, varname, value)
        return func
    return decorate

然后使用这样的代码:

@static_var("counter", 0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

它仍然会要求你使用foo. 前缀,不幸的。


编辑(感谢ony):这看起来更好:

def static_vars(**kwargs):
    def decorate(func):
        for k in kwargs:
            setattr(func, k, kwargs[k])
        return func
    return decorate

@static_vars(counter=0)
def foo():
    foo.counter += 1
    print "Counter is %d" % foo.counter

您可以将属性添加到函数中,并将其用作静态变量。

def myfunc():
  myfunc.counter += 1
  print myfunc.counter

# attribute must be initialized
myfunc.counter = 0

或者,如果您不想在函数外部设置变量,则可以使用hasattr()来避免AttributeError异常:

def myfunc():
  if not hasattr(myfunc, "counter"):
     myfunc.counter = 0  # it doesn't exist yet, so initialize it
  myfunc.counter += 1

无论如何,静态变量很少,你应该为这个变量找到一个更好的地方,很可能在一个类中。


人们也可以考虑:

def foo():
    try:
        foo.counter += 1
    except AttributeError:
        foo.counter = 1

推理:

  • 很多pythonic( ask for forgiveness not permission
  • 使用异常(仅引发一次)而不是if分支(认为StopIteration异常)
  • 链接地址: http://www.djcxy.com/p/54159.html

    上一篇: What is the Python equivalent of static variables inside a function?

    下一篇: Using Pylint with Django