linustd 发表于 2014-08-17 11:41

UnboundLocalError: local variable 'set_key' referenced before assignment

邪门,本人写了一个缓存的装饰类,为了方便使用,实现的是可以当做类装饰器使用,可以实例化类之后,使用这个实例的一个方法做装饰器,还可以直接把这个实例当做一个缓存直接在代码种get,set.

但是发现一个问题,就是这个set_key参数,本来是一个可选参数,如果设置了这个参数,就用这个参数当做缓存的key,如果没有设置,就自己合成一个key,代码如下:
    def decorate(self, set_key=None, *set_args, **set_kwargs):
      def wrap(func):
            def wrapped_func(*func_args, **func_kwargs):
                if set_key is None:
                  set_key = CacheDecorator.make_key(self.domain, func.__name__, *func_args, **func_kwargs)
                value = self.cache.get(set_key)
                if value is None:
                  value = func(*func_args, **func_kwargs)
                  self.cache.set(set_key, value, *set_args, **set_kwargs)
                return value
            return wrapped_func
      return wrap
就是简单的
                if set_key is None:
这一样,竟然提示错误:
    set_key = set_key
UnboundLocalError: local variable 'set_key' referenced before assignment
如果说这行错误的话,那
                  value = func(*func_args, **func_kwargs)
                  self.cache.set(set_key, value, *set_args, **set_kwargs)
这两行也使用了形参,怎么就没提示出错呢?

linustd 发表于 2014-08-17 11:57

操它,稍微改了一下:
   def decorate(self, set_key=None, *set_args, **set_kwargs):
      def wrap(func):
            def wrapped_func(*func_args, **func_kwargs):
                if set_key is None:
                  key = CacheDecorator.make_key(self.domain, func.__name__, *func_args, **func_kwargs)
                else:
                  key = set_key
                value = self.cache.get(key)
                if value is None:
                  value = func(*func_args, **func_kwargs)
                  self.cache.set(key, value, *set_args, **set_kwargs)
                return value
            return wrapped_func
      return wrap
就是
                if set_key is None:
                  key = CacheDecorator.make_key(self.domain, func.__name__, *func_args, **func_kwargs)
                else:
                  key = set_key
重新添加了另一个变量,来接收set_key的值,竟然就不出错了,这什么意思?
页: [1]
查看完整版本: UnboundLocalError: local variable 'set_key' referenced before assignment