Python 为什么装饰师必须在他们';重新调用,但函数不';T

Python 为什么装饰师必须在他们';重新调用,但函数不';T,python,decorator,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

我在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
这是失败的。
name错误:未定义名称“计时”

然而,这显然并没有失败:

def a():
    result = b()
    return result
def b():
    return 'foo'
如果decorator是函数,那么这里有什么区别呢?

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

在您的示例中,在创建
my_test\u函数时(可能是导入时间)调用装饰器,而
b
在调用
a
之前不会被调用

如果执行以下操作,您将看到一个
NameError
,就像decorator案例一样:

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

a()  # Call `a` before `b` has been defined.

def b():
    return 'foo'

试着在
b
的定义之前调用
a()
,然后它会抱怨
b()
。我不知道你是怎么做的:,但是如果函数在另一个函数之外调用,它们只需要在调用之前声明,对吗?我在这两者上面定义了
z
,并称之为,它起作用了。@Ares——基本上,规则是在引用之前必须声明所有内容。记住这一点的关键是,代码行不会按照行号的顺序执行(例如,函数中的代码行在被调用之前不会执行)。何时收集引用?节目什么时候开始?@Ares--对不起,我没听懂。你所说的“何时收集参考文献”是什么意思?对象(包括函数)是在执行其代码行时创建的。因此,(假设没有错误),我的示例代码基本上是“创建函数
a
,然后调用
a
,然后创建函数
b
”。但是,由于调用
a
时未创建
b
,因此出现了一个错误。我询问它是否从上到下移动,定义变量和函数,以及调用任何顶层函数,然后返回到
main
并实际执行?我已经习惯了Java和C语言,在这两种语言中,不能只在浮动空间中抛出对函数的调用,它们必须在函数中。