免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2591 | 回复: 1
打印 上一主题 下一主题

UnboundLocalError: local variable 'set_key' referenced before assignment [复制链接]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-08-17 11:41 |只看该作者 |倒序浏览
邪门,本人写了一个缓存的装饰类,为了方便使用,实现的是可以当做类装饰器使用,可以实例化类之后,使用这个实例的一个方法做装饰器,还可以直接把这个实例当做一个缓存直接在代码种get,set.

但是发现一个问题,就是这个set_key参数,本来是一个可选参数,如果设置了这个参数,就用这个参数当做缓存的key,如果没有设置,就自己合成一个key,代码如下:

  1.     def decorate(self, set_key=None, *set_args, **set_kwargs):
  2.         def wrap(func):
  3.             def wrapped_func(*func_args, **func_kwargs):
  4.                 if set_key is None:
  5.                     set_key = CacheDecorator.make_key(self.domain, func.__name__, *func_args, **func_kwargs)
  6.                 value = self.cache.get(set_key)
  7.                 if value is None:
  8.                     value = func(*func_args, **func_kwargs)
  9.                     self.cache.set(set_key, value, *set_args, **set_kwargs)
  10.                 return value
  11.             return wrapped_func
  12.         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)
这两行也使用了形参,怎么就没提示出错呢?

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 10:01:44
2 [报告]
发表于 2014-08-17 11:57 |只看该作者
操它,稍微改了一下:

  1.    def decorate(self, set_key=None, *set_args, **set_kwargs):
  2.         def wrap(func):
  3.             def wrapped_func(*func_args, **func_kwargs):
  4.                 if set_key is None:
  5.                     key = CacheDecorator.make_key(self.domain, func.__name__, *func_args, **func_kwargs)
  6.                 else:
  7.                     key = set_key
  8.                 value = self.cache.get(key)
  9.                 if value is None:
  10.                     value = func(*func_args, **func_kwargs)
  11.                     self.cache.set(key, value, *set_args, **set_kwargs)
  12.                 return value
  13.             return wrapped_func
  14.         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的值,竟然就不出错了,这什么意思?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP