Python 为什么装饰师必须在他们';重新调用,但函数不';T
我在Python 2.7中有以下示例: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
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语言,在这两种语言中,不能只在浮动空间中抛出对函数的调用,它们必须在函数中。