模拟函数的静态变量

时间:2013-03-18 16:07:00

标签: python

解决方案:错误是我的功能实际上是一种方法。

我正在尝试使用装饰器来模拟函数的变量。为什么我在下面的最后一行出现此错误? global name 'onecmd' is not defined

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

@static_var("last", None)
def onecmd(self, line):
    if line == "lastcmd":
        line = onecmd.last
    else:
        onecmd.last = line

1 个答案:

答案 0 :(得分:4)

您的代码似乎希望能够作为全局访问onecmd,但这是方法。在模块级别定义的函数确实可以通过其名称访问(因为它们存储为全局),但类方法仅存储在类对象中。

你需要通过你定义它的类找到函数对象,或者通过self属性,然后返回类,然后是函数:

@static_var("last", None)
def onecmd(self, line):
    onecmd = type(self).onecmd.im_func  # im_func is the wrapped function
    if line == "lastcmd":
        line = onecmd.last
    else:
        onecmd.last = line

由于您已经有了类方法,因此最好将变量存储在上:

class Foo(object):
    last = None

    def onecmd(self, line):
        if line == "lastcmd":
            line = type(self).last
        else:
            type(onecmd).last = line

或者甚至将其改为类方法:

class Foo(object):
    last = None

    @classmethod
    def onecmd(cls, line):
        if line == "lastcmd":
            line = cls.last
        else:
            cls.last = line