【问题标题】:python wrapper in wrapper - order of execution confusing?包装器中的python包装器 - 执行顺序令人困惑?
【发布时间】:2019-01-22 15:02:45
【问题描述】:

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

我的问题是,为什么 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()

【问题讨论】:

    标签: python-3.x wrapper


    【解决方案1】:

    这很容易解释:

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

    3
    1
    

    那是因为内部装饰器print_three先被调用,print_one在后装饰函数。

    包装函数内的打印语句(修改您的原始函数)在调用函数时执行。因为print_four 没有使用装饰器的参数,所以你基本上只是用print_two 装饰它。所以最终函数的等价物类似于

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-07
      • 1970-01-01
      • 2017-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-29
      • 2015-02-05
      相关资源
      最近更新 更多