python2.7 - [装饰器] 一例有趣的装饰器研究( 为什么不生效 )
本文介绍了python2.7 - [装饰器] 一例有趣的装饰器研究( 为什么不生效 )的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
实际现象
- 两种不同的赋值方案, 符合直觉的那种反而不生效
预期现象
- 到底是什么原因导致: 注释的那种生效, 没注释的反而不生效( 符合人类直觉的)?
相关代码
- 装饰器代码及测试代码
import time
def attach_executing_time(func):
_executing_time = [0] # Python2 用这种折中的方法. Python3可用nonlocal
def _wrapper(*args, **kwargs):
start = time.time()
func_result = func(*args, **kwargs)
_executing_time[0] = time.time() - start
return func_result
_wrapper.executing_time = _executing_time[0]
# _wrapper.executing_time = lambda: _executing_time[0] # 反直觉的, 反而可以work!
return _wrapper
@attach_executing_time
def func(a, b):
time.sleep(3)
return a + b
def main():
func(1, 1)
print(func.executing_time)
# print(func.executing_time())
if __name__ == '__main__':
main()
上下文环境
- Python2.7
解决方案
python 是值传递
当执行 _wrapper.executing_time = _executing_time[0]
时,仅仅是把 _executing_time[0]
的值(也就是 0) 赋给了 _wrapper.executing_time
,之后在 _wrapper
中对 _executing_time[0]
的修改并不会反映到 _wrapper.executing_time
上
这篇关于python2.7 - [装饰器] 一例有趣的装饰器研究( 为什么不生效 )的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文