python 装饰器 和 debug 结合,方便小白理解(一步步解读)

#仅供参考:

'''
带不定长参数的装饰器
debug  共计17步\
右侧注释为debug时程序依次执行的步骤。从1开始,共计17步
'''
def outer(fn):								# 1 (读取告诉python:outer为函数而不是变量),3(将装饰器中信息:func函数传入outer装饰器的倒数第二层中的fn形参(因为倒数第一层是传递func参数用的,存在多层嵌套的装饰器,但是吧倒数第一层和倒数第二层是固定的参数:分别是被装饰函数的函数对象和函数参数))
	def inner(*args,**kwargs):				#4(按照上下顺序:读取inner并识别为函数对象),
		start = time.time()					#8(将获取的实参直接放入第6步中的形参中,即第4步的倒数第一层函数。依次执行inner函数),
		fn(*args,**kwargs)				#注意,这里给fn传参依然需要井号			#9(依次执行inner并传递实参,遇见func函数,开始调用func函数并执行func函数的过程),14(成功完成了func函数的执行),
		runtime = time.time() - start		#15(顺序执行下一步),
		print(runtime)						#16(获得装饰器的最终结果,并传递给func实例对象),
	return inner							#5(读取最外层函数的返回值,其他程序也都是这样,先读取函数名,在读取前套函数和返回值,总体上是从上到下),
#装饰器
@outer										# 2(读取装饰器和被装饰的函数func,下一步吧func的信息传送给装饰器outer中的形参fn),6(顺序读取装饰器,并将下一行视为outer(func)(user,name,pwd)函数,最后一个括号有待传的三个形参数),
def func(user,name,pwd):					#
	for i in range(1):						#10(执行func函数),12(执行func函数,下一轮for为FALSE,跳过for下面的语句),
		time.sleep(1)						#11(执行func函数),
	print(user,name,pwd)					#13(执行func函数),
func('yangyong','yangliu',1232445)			#7(顺序读取到执行函数:func的实例对象并且获得实参),17(绕了一圈,结果被传递回来,gg,完毕),
#--------------------------------------------------------------------------------------------------------------

如有理解偏差,恳请矫正。

展开阅读全文

没有更多推荐了,返回首页