包装中的python包装器-执行顺序令人困惑吗?

时间:2019-01-22 15:02:45

标签: python-3.x wrapper

这是我第一次在这里发布问题,因此,如果我违反任何规则,我深表歉意。谢谢

我的问题是,为什么要进行python3打印 3 1个 2 4  代替 3 4 1个 2 4.下面的代码? 我的论据是...如果python要打印2 [这意味着从print_one中读取print_two],为什么python在打印1之前不先打印4?

非常感谢。

def print_one(x):
    print(1)
    def print_two():
        print(2)
        return x()
    return print_two

def print_three(x):
    print(3)
    def print_four():
        print(4)

    return print_four

def major_print():
    print("major print")

major_print = print_one(print_three(major_print))

if __name__ == "__main__":
    major_print()

1 个答案:

答案 0 :(得分:0)

这很容易解释:

两个装饰函数中的第一个print语句在装饰函数后立即执行。如果省略函数调用,则会得到输出

3
1

这是因为先调用内部装饰器print_three,然后再装饰print_one

当调用函数时,将执行包装函数(修改原始函数)中的print语句。因为print_four不使用装饰器的参数,所以您基本上只用print_two装饰它。因此,等同于最终功能的将是

def major_print():
    print(2)
    print(4)
    return None

通过这种方式,您可以得到所说的数字序列3124作为控制台输出。