python2.7 - [装饰器] 一例有趣的装饰器研究( 为什么不生效 )

查看:143
本文介绍了python2.7 - [装饰器] 一例有趣的装饰器研究( 为什么不生效 )的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

实际现象

  1. 两种不同的赋值方案, 符合直觉的那种反而不生效

预期现象

  1. 到底是什么原因导致: 注释的那种生效, 没注释的反而不生效( 符合人类直觉的)?

相关代码

  • 装饰器代码及测试代码

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()

上下文环境

  1. 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆