为什么装饰者必须在他们被召唤之前被宣布,但功能不是?

时间:2016-07-08 21:24:29

标签: python decorator

我在Python 2.7中有以下示例:

import time
@timing
def my_test_function():
    return 5+5
def timing(f):
    def wrap(*args):
        time1 = time.time()
        ret = f(*args)
        time2 = time.time()
        print '%s function took %0.3f ms' % (f.func_name, (time2-time1)*1000.0)
        return ret
    return wrap

这失败了。 NameError: name 'timing' is not defined

但是,这显然不会失败:

def a():
    result = b()
    return result
def b():
    return 'foo'

如果装饰者是功能,那么这里的区别是什么?

1 个答案:

答案 0 :(得分:6)

函数 do 必须在调用之前声明。唯一的区别是装饰器通常比其他函数更早被调用。

在您的示例中,在创建/* entire container, keeps perspective */ .flip-container { perspective: 1000; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; } /* UPDATED! flip the pane when .flipped class applied */ .flip-container.flipped .back { -webkit-transform: rotateY(0deg); transform: rotateY(0deg); } .flip-container.flipped .front { -webkit-transform: rotateY(180deg); transform: rotateY(180deg); } .flip-container, .front, .back { width: 7.1428rem; height: 10rem; } /* flip speed goes here */ .flipper { -webkit-transition: 200ms; transition: 200ms; -webkit-transform-style: preserve-3d; transform-style: preserve-3d; position: relative; } 时调用装饰器(可能是导入时间),而my_test_function在调用b之前不会被调用。

如果您执行了以下操作,您会看到a就像装饰器一样:

NameError