簡體   English   中英

包裝中的python包裝器-執行順序令人困惑嗎?

[英]python wrapper in wrapper - order of execution confusing?

這是我第一次在這里發布問題,因此,如果我違反任何規則,我深表歉意。 謝謝

我的問題是,為什么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()

這很容易解釋:

裝飾功能后,將立即執行兩個裝飾功能中的第一個print語句。 如果省略函數調用,則會得到輸出

3
1

這是因為內部裝飾器print_three被調用,而print_one隨后裝飾該函數。

包裝函數內部的print語句(修改原始函數)在調用該函數時執行。 因為print_four不使用裝飾器的參數,所以您基本上只用print_two裝飾它。 因此,相當於最終功能的內容將類似於

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

這樣,您將獲得所說的數字序列3124作為控制台輸出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM