请教Python装饰器@嵌套顺序的问题
请教大家两个Python装饰器@的问题。
问题一:嵌套。
1 def Decorator2(plugger2):
2 plugger2()
3 print ("Plugger2 内调 here!")
4 def Decorator3(plugger3):
5 plugger3()
6 print ("Plugger3 内调 here!")
7 def DecoratorTesting():
8 @Decorator2
9 def plugger2():
10 print ("Plugger2 外调 here!")
11 @Decorator3
12 def plugger3():
13 print ("Plugger3 外调 here!")
最终运行DecoratorTesting()结果是:
Plugger2 外调 here!
Plugger3 外调 here!
Plugger3 内调 here!
Plugger2 内调 here!
我对DecoratorTesting()这个结果不太理解。当第8行@Decorator2的时候,难道不是应该立即回到第1行打印“内调”吗?当第11行@Decorator3的时候,难道不是应该立即回到第4行打印“内调”吗?为什么结果却是刚才的顺序呢?
问题二:返回。
def go_Before(request, follow_up):
print ("Go to the before yields %s." %(request*2))
def go_After(request, follow_up):
print ("Go to the after yields %s." %(follow_up*3))
5 def Filter(before_func, after_func):
6 def f1(main_func):
7 def f2(request, follow_up):
8 before_result = before_func(request, follow_up)
9 if (before_result != None): return before_result;
10 main_result = main_func(request, follow_up)
11 if (main_result != None): return main_result;
12 after_result = after_func(request, follow_up)
13 if (after_result != None): return after_result;
14 return f2
15 return f1
@Filter(go_Before, go_After)
def go_Middle(request, follow_up):
print ("Go to the middle.")
最终运行go_Middle('@', '#')结果是:
Go to the before yields @@.
Go to the middle.
Go to the after yields ###.
我对go_Middle()这个结果不太理解。第9行,应该已经彻底返回了。可是为什么还会继续执行第10行和以后的部分呢?
谢谢了先!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
问题1:DecoratorTesting()的执行顺序
这里就是你疑惑的关键点之一,实际上你明白了上面函数的执行流程,你也就明白了为什么"plugger2内调会最后打印了"
无论如何,
print("Plugger2 内调 here!")
会在plugger2()函数执行完成之后再执行,所以它一定会是最后执行的语句然后我们看plugger()函数是怎么执行的:
到了这里所有print顺序都已经理清楚了。按照我标注的P1--P4的顺序打印的。
问题2:返回
第9行没有结束的原因是:
before_func()
没有返回值,默认返回None
.所以
if before_result != None
是不成立的,会继续往下执行。问题一:嵌套
def Decorator2(plugger2):
@Decorator2
def plugger2():
当你使用装饰器的时候等同用把下面的def 传给了你装饰器里面的形参 plugger2, plugger3 这是装饰器里面运行形参这个def 代码从上至下所以会限制性形参所指向的def运行这是就先出来外调 内部装饰器同样的道理
问题二:返回
第一题
记住下面的语法,再加一点细心便可理解
像 DecoratorTesting ,可以转变成
第二题
其实第 9 行的条件并不成立
因为 go_Before 没有显式 return 语句, 默认返回 None.