Python装饰器代码预期输出1次'hello'实际输出2次的原因
现象原因
两次打印是Python装饰器语法的固有执行逻辑导致的,@装饰器名称是Python提供的语法糖,会在被装饰函数定义完成后立刻执行装饰器调用,不需要手动触发。
代码的完整执行顺序拆解:
- 第一步:解释器加载定义
hello函数,此时仅创建函数对象,不会运行函数内部的打印语句。 - 第二步:解释器执行到
@hello装饰hi函数的逻辑,这部分代码等价于hi = hello(hi):等def hi(): pass定义完hi函数对象后,会立刻把hi作为参数传入hello函数调用,这是第一次触发print('hello')。另外你的hello函数没有设置返回值,默认返回None,所以这一步执行完后,变量hi存储的值已经不是原来的函数,而是None。 - 第三步:执行最后一行手动写的
hello(hi),再次主动调用hello函数,传入的参数是上一步得到的None,这是第二次触发print('hello')。
如果把装饰器语法糖展开成等价的普通Python代码,逻辑会更清晰:
def hello(hi): print('hello') # @hello 装饰器等价于下面这两行 def hi(): pass hi = hello(hi) # 第一次打印hello hello(hi) # 第二次打印hello
内容的提问来源于stack exchange,提问作者dekalog
相关产品推荐
相关产品推荐

