Python中'@f'的作用是什么?为何使用后未触发除零错误?
关于Python中@符号的作用及你的代码分析
@是Python里的装饰器语法糖,作用是简化装饰器函数的调用,本质是把被装饰的函数作为参数传给装饰器函数,再把原函数名重新赋值为装饰器的返回值。最基础的等价写法示例:
# 用@语法 @装饰器函数 def 被装饰函数(): pass # 等价于不用@的写法 def 被装饰函数(): pass 被装饰函数 = 装饰器函数(被装饰函数)
现在拆解你的代码执行过程:
- 首先定义了第一个
f(a)函数,此时全局变量f指向这个只会打印hello的单参数函数。 - 遇到
@f时,Python会把接下来要定义的双参数f(a,b)函数,作为参数传给当前的f(也就是第一个单参数函数)。 - 执行
f(双参数函数):此时第一个f被调用,参数是那个双参数函数,函数内部打印hello,因为没有return语句,默认返回None。 - 最后全局变量
f被重新赋值为None。
你看到的hello是在定义第二个f函数时,装饰器执行过程中打印的,而不是调用f(4,0)时打印的——此时f已经是None,调用它其实会触发TypeError,只是可能你没注意到这个报错。
当移除@f后,第二个f(a,b)会直接覆盖第一个f,调用f(4,0)时执行4%0,自然触发预期的除零错误。
这里要注意:合格的装饰器应该接收一个函数参数,并且返回一个可调用对象(比如函数),你代码里第一个f不符合这个要求,属于错误的装饰器用法,才导致了不符合预期的结果。
内容的提问来源于stack exchange,提问作者Mrunal
相关产品推荐
相关产品推荐

